Làm cách nào để thực hiện cuộc gọi api trong python?

Trong nhiều tập lệnh tự động hóa, bạn sẽ truy xuất thông tin qua một số loại giao diện và sau đó thực hiện điều gì đó với dữ liệu. Giao diện thường là giao diện lập trình ứng dụng API. Đối với những người mới sử dụng API, chúng có vẻ khó khăn, nhưng chúng không cần thiết. Tương tác với một thiết bị thông qua API cũng đơn giản như bất kỳ cuộc trò chuyện nào trên thiết bị khác mà bạn có thể có

Ví dụ, cơ sở dữ liệu thường sử dụng SQL. Ngôn ngữ truy vấn có cấu trúc là tài liệu đầy đủ và dễ hiểu khi bạn hiểu rõ về nó. Máy chủ thư sử dụng SMTP. Trước đây, các kỹ sư có thể telnet đến cổng 25 trên máy chủ thư và gửi thư bằng tay bằng các lệnh giao thức chuyển thư đơn giản. Bạn biết. Cho vui. Các máy chủ web sử dụng HTTP, ngôn ngữ được hiểu rõ vì có lẽ bất kỳ giao thức nào cũng có thể

Trong mỗi ví dụ này, có một định dạng dễ hiểu cho cuộc hội thoại tương ứng. Định dạng sẽ chỉ định nhiều thứ, nhưng quan trọng nhất đối với chúng tôi, các giao thức này sẽ mô tả…

  1. Làm thế nào để đặt một câu hỏi
  2. Những gì mong đợi trở lại trong phản ứng

Với API, đó là phần lớn những gì bạn cần hiểu–cách đặt câu hỏi đúng và sau đó diễn giải câu trả lời. API từ nhiều nhà cung cấp được ghi chép đầy đủ, giúp bạn dễ dàng biết câu hỏi nào cần hỏi để truy xuất thông tin mà bạn đang tìm kiếm. Định dạng của câu trả lời cũng sẽ được ghi lại để bạn có thể mã hóa tập lệnh của mình để phân tích câu trả lời một cách thích hợp

Tài liệu API tốt không phổ biến. Trên thực tế, đó có thể là một điểm quyết định mà bạn sẽ cần đưa ra khi sử dụng hoặc tránh sử dụng API–cho dù API đó có được ghi chép đầy đủ hay không

Trong Python, có một số thư viện có sẵn giúp dễ dàng tương tác với API. Chúng tôi sẽ tập trung vào các API RESTful vì chúng rất phổ biến. Vì các API RESTful sử dụng lệnh gọi kiểu HTTP là điển hình nhất, chúng tôi sẽ sử dụng thư viện http yêu cầu Python trong ví dụ của chúng tôi

Đối với bài viết này, chúng tôi sẽ không đề cập đến việc gửi dữ liệu qua API. Đương nhiên, đôi khi bạn sẽ muốn gửi dữ liệu trong tập lệnh tự động hóa của mình. Đó là cách bạn sẽ khiến mọi thứ diễn ra trong các ứng dụng hoặc với cơ sở hạ tầng của mình. Tuy nhiên, chúng tôi muốn giữ hệ số rủi ro ở mức thấp (đây là lệnh gọi API REST đầu tiên của bạn. ), vì vậy chúng tôi sẽ duy trì hoạt động của API ở đây ở chế độ chỉ đọc

xác thực

Bước đầu tiên để truy cập API là xác thực nó, điều này phải hợp lý. Bạn không thể thực hiện truy vấn SNMPv2c nếu không có chuỗi cộng đồng chính xác hoặc định cấu hình thiết bị mạng mà không có tên người dùng, mật khẩu và có thể là cấu hình RADIUS hoặc TACACS phù hợp

Xác thực API thường có dạng một hoặc nhiều mã thông báo. Nghĩa là, thay vì tên người dùng và mật khẩu, bạn có thể cần phải tương tác với nhà cung cấp API để tạo mã thông báo, sau đó trình bày mã thông báo đó như một phần của lệnh gọi API của bạn. Với mã thông báo, bạn sẽ được xác thực và cuộc gọi của bạn được ủy quyền. Nếu không có mã thông báo, máy chủ API sẽ bỏ qua bạn hoặc (nhiều khả năng) trả về lỗi

Trong một số trường hợp, sơ đồ mã thông báo xác thực có thể phức tạp. Ví dụ: tôi thấy việc triển khai OAuth của Twitter gây nhầm lẫn, yêu cầu như khóa API (khóa của người tiêu dùng), bí mật API (bí mật của người tiêu dùng), mã thông báo truy cập và bí mật mã thông báo truy cập để thực hiện thành công cuộc gọi đối với API Twitter. Mặt khác, thư viện Tweepy Python có nghĩa là tôi không cần phải hiểu sơ đồ OAuth hoạt động như thế nào. Tôi cung cấp cho Tweepy bốn mã thông báo và Tweepy xử lý các mưu đồ OAuth và định dạng lệnh gọi API cho tôi

Trong các trường hợp khác, sơ đồ mã thông báo xác thực đơn giản hơn. Tôi thấy quy trình tạo mã thông báo của Slack cho các ứng dụng chủ yếu là trực quan. Đối với một Slackbot thô sơ mà tôi đã viết bằng Python, tôi chuyển mã thông báo của ứng dụng Slackbot cho thư viện Slack Python. Với mã thông báo đó, tôi được phép thực hiện bất kỳ lệnh gọi API nào mà tôi đã ủy quyền cho ứng dụng Slackbot của mình thực hiện khi tôi tạo ứng dụng và cài đặt ứng dụng đó vào không gian Slack của mình

Các API khác đơn giản hơn nhiều. Chẳng hạn, lược đồ xác thực API của NetBox yêu cầu bạn tạo mã thông báo ủy quyền cho tài khoản của mình, sau đó trình bày mã thông báo đó dưới dạng một chuỗi trong tiêu đề HTTP kèm theo yêu cầu của bạn. Không giống như vũ điệu hủy diệt mã thông báo OAuth của Twitter, không có gì phức tạp về điều này

Ví dụ: đây là lệnh gọi API không phải Python tới NetBox bằng cách sử dụng tiện ích curl đối với phiên bản NetBox không sản xuất mà tôi chạy trong phòng thí nghiệm

1

uốn -X NHẬN "http. //172. 22. 45. 1/api/ipam/aggregates/" -H "chấp nhận. ứng dụng/json" -H "Ủy quyền. Mã thông báo bc19a8a967173c8f37e0f5d7ba32da9cba8dea8e"

Lưu ý -H “Ủy quyền. Mã thông báo…” chút. Với bit đó, NetBox gửi lại cho tôi một khối dữ liệu JSON mà tôi quan tâm

1

{"đếm". 9, . . . }

Không có mã thông báo ủy quyền đó, NetBox vẫn gửi cho tôi JSON. Nhưng thay vì dữ liệu tôi quan tâm, NetBox nói với tôi rằng tôi đã làm nó thất vọng sâu sắc

1

{"detail". "Thông tin đăng nhập xác thực không được cung cấp. "}

Nếu tôi gửi mã thông báo ủy quyền không chính xác, NetBox sẽ thể hiện sự thất vọng của mình theo cách khác

1

{"detail". "Mã thông báo không hợp lệ"}

Cho đến nay, chúng ta đã nói về API hơi trừu tượng. Chúng tôi chưa dịch bất kỳ khái niệm nào của mình sang mã Python, vì vậy hãy bắt đầu với điều đó. Trong các phần sau, chúng ta sẽ trích dẫn một vài dòng tại một thời điểm của một đoạn mã Python ngắn và nói về những gì đang xảy ra

Định dạng URL

Một trong những điều chúng ta cần biết với lệnh gọi API là cách đặt câu hỏi. Tôi sẽ tiếp tục sử dụng NetBox làm ví dụ của chúng tôi. Để biết cách đặt câu hỏi về NetBox API, bạn có thể tham khảo tài liệu về NetBox API. Khi bạn đã cài đặt NetBox, liên kết tài liệu API nằm ở chân trang của giao diện người dùng web

Làm cách nào để thực hiện cuộc gọi api trong python?

Như ví dụ của chúng tôi, hãy hỏi API NetBox về tất cả các khu vực chúng tôi đã xác định trong tính năng Trình quản lý cơ sở hạ tầng trung tâm dữ liệu (DCIM). Bạn có thể hỏi bất cứ điều gì bạn thích, nhưng trong cài đặt NetBox của tôi, chỉ có 2 vùng DCIM được xác định, tạo ra một ví dụ gọn gàng

API NetBox là RESTful (chuyển trạng thái đại diện) và được truy cập bằng HTTP. REST và HTTP không đồng nghĩa với nhau, mặc dù bạn sẽ nhận thấy rằng các API REST thường sử dụng HTTP để truyền biểu diễn trạng thái

Bạn đã nhận được điều đó?

“Này, API. Tôi muốn biết điều cụ thể này về trạng thái của thiết bị mà bạn đang sử dụng. Hãy chuyển trạng thái đó cho tôi. ”

“Chắc chắn rồi, nhưng chỉ vì bạn được ủy quyền. Đây là một đại diện của trạng thái cụ thể đó. ”

Sử dụng nền tảng đó, cách chúng ta cần đặt câu hỏi là thông qua URL HTTP. Trong Python, tôi muốn tạo URL thông qua một tập hợp các biến. Nó làm cho mã có thể tái sử dụng dễ dàng, giả sử nếu sau này bạn muốn đưa lệnh gọi API vào một chức năng. Hãy kiểm tra mã dưới đây

Làm cách nào để thực hiện cuộc gọi api trong python?

Dòng 1 nhập biến môi trường NETBOX_APITOKEN và gán nó cho biến apiToken. Nhập mã thông báo và các chuỗi ủy quyền khác từ các biến môi trường cục bộ là một cách cấp mục nhập để giữ bí mật của bạn khỏi mã của bạn. Chắc chắn, tôi có thể đã nhúng mã thông báo ngay trong tập lệnh, nhưng đó là một cách làm tồi tệ. Tôi sẽ không giải thích cách nhập biến môi trường vào Python ở đây

Dòng 2 tạo một từ điển Python chứa một mục duy nhất. Khóa Ủy quyền có giá trị chuỗi ký tự là Mã thông báo theo sau là khoảng trắng, cộng với giá trị của mã thông báo tôi đã nhập từ biến môi trường NETBOX_APITOKEN. Tại sao một từ điển mà không phải là một biến chuỗi?

Dòng 3 là khoảng trắng cố ý. Khoảng trắng và nhận xét rất quan trọng trong mã. Trong Python, khoảng trắng đôi khi thực sự là một yêu cầu định dạng

Dòng 4 xây dựng phần đầu tiên của URL. 172. 22. 45. 1 là địa chỉ IP của máy chủ NetBox đang chạy trong phòng thí nghiệm của tôi. /api mở đầu tất cả các lệnh gọi API tới NetBox

Dòng 5 xây dựng phần thứ hai của URL. Tôi đã nhận được /dcim/regions/ từ tài liệu API NetBox được tích hợp trong máy chủ. Truy cập tài liệu API qua liên kết API ở chân trang của giao diện người dùng web. Chú ý đến dấu gạch chéo. Trong trường hợp của NetBox, lệnh gọi API sẽ thất bại nếu bạn gọi /dcim/regions thay vì /dcim/regions/

Dòng 6 kết hợp các thành phần URL thành một URL lớn, đó là lệnh gọi API mà chúng tôi sẽ thực hiện qua HTTP. Mặc dù NetBox chọn chuyển mã thông báo xác thực dưới dạng tiêu đề HTTP, nhưng nhiều API khác được thiết lập để bao gồm xác thực như một phần của chính URL. Nếu đó là trường hợp ở đây, tôi sẽ có một biến bổ sung mà tôi đã xác định phần xác thực của chuỗi URL

Đọc tài liệu API

Bạn có thể muốn biết thêm chi tiết về cách tôi biết rằng /dcim/regions/ là điều đúng đắn và điều đó đáng để chỉ ra. Tại sao? . Trên thực tế, nhiều nhà cung cấp thiết bị nói về tài liệu API Swagger của họ như thể đó là tiền đặt cược cho bất kỳ triển khai API nào

Đây là một ví dụ về tài liệu API do Swagger tạo. Trên máy chủ NetBox của mình, tôi cuộn xuống phần /dcim/regions/ của trang tài liệu API và mở rộng nó để chụp ảnh này

Làm cách nào để thực hiện cuộc gọi api trong python?
Ảnh chụp màn hình cắt bớt phần còn lại của phần mở rộng, nhưng những gì bạn thấy là đủ để bạn hiểu. Có URL cấp cao nhất mà bạn có thể yêu cầu, cùng với các trường đủ điều kiện mà bạn có thể điền nếu muốn thu hẹp tập hợp kết quả

Chẳng hạn, tôi đã xác định URL cuộc gọi API của mình là 172. 22. 45. 1/api/dcim/khu vực/. Nhưng nếu tôi muốn biết thông tin về khu vực DCIM có tên là “Lab”, lệnh gọi API của tôi sẽ là 172. 22. 45. 1/api/dcim/khu vực/?name=Phòng thí nghiệm

đặt câu hỏi

Bây giờ chúng tôi đã xây dựng câu hỏi, chúng tôi đã sẵn sàng để đặt câu hỏi

1

nbApiRawAnswer= requests.get(nbApiQuestion, headers=nbApiHeaders)

Dòng 1 sử dụng thư viện yêu cầu Python để thực hiện lệnh gọi API và lưu phản hồi trong biến nbApiRawAnswer

Thực tế, chúng tôi đang nói…

“Này, yêu cầu. Tôi cần bạn để có được một cái gì đó cho tôi. Cụ thể, lấy URL được lưu trữ trong nbApiQuestion. Ồ, và tôi cần bạn bao gồm tất cả các tiêu đề HTTP được lưu trữ trong từ điển nbApiHeaders trong thao tác nhận của bạn. Bất cứ điều gì máy chủ gửi lại cho bạn, hãy lưu nó vào nbApiRawAnswer. Được chứ? . ”

Có lẽ tôi đã tô điểm một chút với những điều tốt đẹp về mặt xã hội, nhưng tôi muốn tưởng tượng rằng các API phản ứng tốt với sự lịch sự. tôi biết tôi làm

Hiểu câu trả lời

Giả sử tôi đã hỏi một câu hỏi hợp lệ và bao gồm mã thông báo ủy quyền hợp lệ, NetBox sẽ trả lời lệnh gọi API của tôi bằng một câu trả lời. Phản hồi API NetBox được gửi dưới dạng JSON. Dữ liệu được định dạng dưới dạng JSON xuất hiện dưới dạng phân cấp các cặp khóa-giá trị được phân tách bằng dấu ngoặc nhọn, dấu ngoặc vuông và dấu phẩy

Mẹo dành cho bạn là hiểu đầu ra JSON này. Bạn đang nhìn cái gì vậy?

Chúng ta sẽ quay lại Python trong giây lát, nhưng trước tiên, hãy xem đốm màu JSON thô này được truy xuất qua máy chủ macOS bằng cách sử dụng curl

1

2

cuộn tròn -X NHẬN -H "Authorization: Token bc19a8a967173c8f37e0f5d7ba32da9cba8dea8e" "http. //172. 22. 45. 1/api/dcim/khu vực/"

{"đếm". 2,"tiếp theo". null,"trước". null,"kết quả". [{"id". 1,"tên". "Phòng thí nghiệm","sên". "phòng thí nghiệm","cha mẹ". null,"site_count". 4},{" . :2,"tên". "Sản xuất","sên". "sản xuất","cha mẹ". null,"site_count". 1}]}

Bạn có thể hiểu được câu trả lời, nhưng nó hơi khó đọc với tư cách là một con người, phải không? . Trong thế giới lập trình, điều này được gọi là in đẹp. Tôi đặt lệnh gọi API của mình vào trình duyệt Firefox (vâng, bạn có thể làm điều đó nếu bạn đã đăng nhập vào máy chủ NetBox của mình) và Firefox đã hiển thị kết quả "đẹp" như bạn thấy bên dưới

Làm cách nào để thực hiện cuộc gọi api trong python?

Trong Python, một cách để in đẹp câu trả lời là sử dụng thư viện json cốt lõi của Python

1

print(json.dumps(nbApiRawAnswer.json(), indent=4))

Dòng 1 yêu cầu Python in phần JSON của nbApiRawAnswer bằng cách sử dụng json. kết xuất định dạng, sử dụng mức thụt lề là 4. Kết quả giống hệt với đầu ra Firefox prettyprint ở trên

Bạn có thể đọc qua đầu ra và hiểu khá rõ về nó ngay bây giờ. (Xem những gì tôi đã làm ở đó?)

  1. Câu hỏi là về các vùng DCIM
  2. Câu trả lời có cấu trúc mà chúng tôi nhận được cho chúng tôi biết có 2 vùng
  3. Cái đầu tiên được gọi là “Lab” và cái thứ hai được gọi là “Production”
  4. Vùng Lab có 4 site. Khu vực sản xuất có 1 trang web

Tất nhiên, những quan sát đó đều là suy luận của riêng chúng tôi. Nếu chúng ta muốn biết thêm chi tiết về câu trả lời thì sao? . Trong phần /dcim/regions/ của trang tài liệu mà tôi đã chụp màn hình ở trên, Swagger cũng ghi lại câu trả lời mong đợi. Nếu chúng tôi mở rộng nó ra đầy đủ, chúng tôi sẽ thấy thông tin này về cấu trúc JSON

Làm cách nào để thực hiện cuộc gọi api trong python?
Trong trường hợp của chúng tôi, chúng tôi không có đối tượng gốc nào được liên kết với các vùng DCIM của chúng tôi, vì vậy đốm màu JSON mà chúng tôi nhận được không phức tạp như tài liệu Swagger chỉ ra rằng nó có thể đã. Nhưng điểm quan trọng hơn là với tài liệu API, bạn có một tài liệu tham khảo để hướng dẫn cách giải thích câu trả lời mà bạn sẽ nhận được cho lệnh gọi API của mình

Thu hẹp phạm vi

Một điểm quan trọng cần hiểu là bạn đang lấy lại toàn bộ câu trả lời JSON mà người viết API đã thiết kế để phản hồi lệnh gọi của bạn, cho dù bạn có muốn toàn bộ đốm màu hay không. Tức là, API không nhất thiết phải hiệu quả. Có lẽ bạn chỉ muốn biết một chi tiết rất cụ thể. Quá tệ. Đây là tất cả những thứ khác nữa. Đối phó với nó

Với SNMP, bạn thăm dò một OID cụ thể và truy xuất đối tượng lá cụ thể đó từ cây MIB. Bạn thường lấy lại một số. Một chuỗi. Mỗi đối tượng lá là một mục cụ thể, phạm vi hẹp. Ngược lại, lệnh gọi API thường trả về một nhánh của cây với tất cả các nhánh và lá tương ứng

Việc tìm hiểu tài liệu API và xác định cách đặt câu hỏi mang lại cho bạn những gì bạn muốn là tùy thuộc vào bạn. Bạn có thể không hỏi được về các đối tượng lá cụ thể nếu không có lệnh gọi API nào cho phép bạn làm điều đó, nhưng hãy cố gắng trở nên hiệu quả nhất có thể

Ví dụ: nếu tôi biết rằng ID của vùng Lab là 1 và tất cả những gì tôi muốn biết là vùng Lab, thì tài liệu API NetBox cho tôi biết có lệnh gọi API /dcim/regions/{id}/ tôi có thể . Điều này thu hẹp phạm vi câu hỏi API hơn và trả về một đốm màu JSON nhỏ hơn với ít dữ liệu không liên quan hơn–để lại–để tập lệnh Python của tôi nằm trong bộ nhớ chỉ để tôi có thể truy cập vào một đối tượng lá đơn mà tôi có thể quan tâm

Toàn bộ kịch bản

Để hoàn thiện, tôi cần cho bạn xem toàn bộ kịch bản

Làm cách nào để thực hiện cuộc gọi api trong python?

Những dòng duy nhất tôi chưa đề cập đến là các câu lệnh nhập ở đầu tập lệnh. Nhập là cách bạn sẽ nhận được chức năng bổ sung mà các thư viện json, os và yêu cầu cung cấp

Tôi yêu các thư viện Python. Các thư viện được viết tốt giống như đạt được siêu năng lực của Python. Tại sao phải viết trình phân tích cú pháp blob JSON của riêng bạn khi ai đó đã hoàn thành công việc đó cho bạn và cung cấp miễn phí trong thư viện?

Để biết thêm thông tin

Khi bạn đã lấy lại dữ liệu từ API, bạn cần phải làm gì đó với nó. Đối với điều đó, bạn nên đọc bài viết sau. Điều này sẽ giúp bạn hiểu cách tham chiếu các đối tượng Python lồng nhau mà bạn có xu hướng lấy lại trong cấu trúc JSON

Làm cách nào để tạo API bằng Python?

Để tạo API trong Python bằng Flask, chúng ta phải cho biết. điểm cuối, phương thức và chức năng sẽ được thực thi trên điểm cuối đó . Hãy xem một ví dụ với API chỉ trả về văn bản “Xin chào thế giới. ”. từ bình nhập Flask, jsonify, request,send_file app = Flask() @app.

Làm cách nào để kết nối API với Python?

Các bước kết nối và gọi API bằng Python .
Nhập thư viện cần thiết. Để kết nối với API và thực hiện các hành động trên đó, chúng ta cần nhập thư viện yêu cầu Python vào môi trường. .
Thực hiện một hành động để kết nối với API. Ở đây, chúng tôi đã sử dụng lệnh GET để kết nối với API như hình–.
In mã phản hồi

Làm cách nào để gọi API REST bằng Python?

Trong mã này, bạn thêm một từ điển tiêu đề chứa một Loại nội dung tiêu đề duy nhất được đặt thành application/json. Điều này cho API REST biết rằng bạn đang gửi dữ liệu JSON cùng với yêu cầu. Sau đó, bạn gọi yêu cầu. post() , nhưng thay vì chuyển todo cho đối số json, trước tiên bạn gọi json .

Chúng tôi có thể sử dụng API trong Python không?

Để làm việc với các API trong Python, chúng tôi cần các công cụ thực hiện các yêu cầu đó. Trong Python, thư viện phổ biến nhất để tạo yêu cầu và làm việc với API là thư viện yêu cầu. Thư viện yêu cầu không phải là một phần của thư viện Python tiêu chuẩn, vì vậy bạn sẽ cần cài đặt nó để bắt đầu