Yêu cầu API trong Python
Trong bài đăng này, chúng tôi sẽ xem xét một trong những mô-đun Python được sử dụng rộng rãi nhất để tương tác với các dịch vụ dựa trên web như API REST, mô-đun Python 1. Nếu bạn từng thắc mắc điều kỳ diệu nào đang diễn ra đằng sau hậu trường khi chạy một trong hàng nghìn mô-đun mạng Ansible hoặc nhiều SDK dựa trên Python có sẵn từ các nhà cung cấp, thì rất có thể các hoạt động cơ bản đang được thực hiện bởi 1. Mô-đun Python 1 là một tiện ích mô phỏng các hoạt động của trình duyệt web bằng mã. Nó cho phép các chương trình tương tác với một dịch vụ dựa trên web trên toàn mạng, đồng thời trừu tượng hóa và xử lý các chi tiết cấp thấp hơn của việc mở kết nối TCP tới hệ thống từ xa. Giống như trình duyệt web, mô-đun 1 cho phép bạn lập trình Show
Truy xuất dữ liệuVí dụ cơ bản nhất về việc sử dụng yêu cầu chỉ đơn giản là truy xuất nội dung của trang web bằng HTTP GET
Đối tượng 5 kết quả sẽ chứa mã HTML thực tế mà trình duyệt sẽ nhìn thấy trong đối tượng 6, có thể được truy cập bằng cách nhập 7________số 8 Có rất nhiều tiện ích tuyệt vời để phân tích cú pháp HTML, nhưng trong hầu hết các trường hợp, chúng tôi sẽ không làm điều đó khi làm việc với API của nhà cung cấp mạng. Trong phần lớn các trường hợp, dữ liệu sẽ trở lại có cấu trúc dưới dạng XML hoặc JSON
Lưu ý rằng đầu ra ở trên có định dạng 8. Điều này được biểu thị bằng chữ thường “b” trước văn bản phản hồi. Chúng tôi có thể chuyển đổi chuỗi này thành một chuỗi bằng cách sử dụng 9 và sau đó sử dụng mô-đun Python 20 để tải nó vào từ điển Python. Tuy nhiên, vì 20 là một trong những định dạng dữ liệu phổ biến nhất nên mô-đun 1 có một phương thức tiện lợi sẽ tự động chuyển đổi phản hồi từ byte sang từ điển Python. Đơn giản chỉ cần gọi 23 2Trong một số trường hợp, chúng tôi sẽ phải chỉ định định dạng dữ liệu mong muốn bằng cách đặt tiêu đề 24. Ví dụ 8Trong ví dụ này, chúng tôi đang thông báo cho API rằng chúng tôi muốn dữ liệu quay lại được định dạng dưới dạng JSON. Nếu API cung cấp nội dung dưới dạng XML, chúng tôi sẽ chỉ định tiêu đề là 25. Loại nội dung phù hợp để yêu cầu phải được nêu rõ trong tài liệu API của nhà cung cấp. Nhiều API sử dụng giá trị mặc định, vì vậy bạn có thể không cần chỉ định tiêu đề. Nautobot tình cờ sử dụng giá trị mặc định là 26, vì vậy không cần thiết phải đặt tiêu đề. Nếu bạn không đặt tiêu đề 24, bạn có thể tìm ra loại nội dung được trả về bằng cách kiểm tra tiêu đề 28 trong phản hồi 3
xác thựcHầu hết các API được bảo vệ bởi cơ chế xác thực có thể khác nhau giữa các sản phẩm. Tài liệu API là tài nguyên tốt nhất của bạn trong việc xác định phương thức xác thực đang sử dụng. Chúng tôi sẽ xem xét một số phương pháp phổ biến hơn với các ví dụ bên dưới Mã APIVới xác thực khóa API, trước tiên bạn phải truy cập cổng quản trị và tạo khóa API. Hãy nghĩ về khóa API giống như cách bạn nghĩ về tên người dùng/mật khẩu quản trị của mình. Trong một số trường hợp, nó sẽ cung cấp quyền truy cập quản trị đọc/ghi cho toàn bộ hệ thống, vì vậy bạn muốn bảo vệ nó như vậy. Điều này có nghĩa là không lưu trữ nó trong mã hoặc trong kho lưu trữ 80 nơi có thể nhìn thấy nó ở dạng văn bản rõ ràng. Thông thường, các khóa API được lưu trữ dưới dạng biến môi trường và được nhập vào thời gian chạy hoặc được nhập từ kho mật khẩu như Hashicorp hoặc Ansible vault. Sau khi khóa API được tạo, nó sẽ cần được đưa vào theo một cách nào đó với tất cả các yêu cầu. Tiếp theo, chúng tôi sẽ mô tả một số phương pháp phổ biến để đưa khóa API vào yêu cầu và cung cấp mã ví dụMã thông báo trong Tiêu đề ủy quyềnMột phương pháp được sử dụng trên nhiều loại API là bao gồm khóa API dưới dạng mã thông báo trong tiêu đề 81. Một vài ví dụ về điều này là trong các phương thức xác thực cho Nautobot và Cisco Webex. Hai ví dụ dưới đây rất giống nhau, với sự khác biệt chính là Nautobot sử dụng 82 trong tiêu đề 81 trong khi Cisco Webex sử dụng 84 trong tiêu đề 81. Việc triển khai điều này không được chuẩn hóa, vì vậy tài liệu API phải chỉ ra định dạng của tiêu đề sẽ là gìAPI NautobotĐầu tiên, cần tạo khóa API từ Nautobot GUI. Đăng nhập vào Nautobot và chọn tên người dùng của bạn ở góc trên bên phải, sau đó xem Hồ sơ của bạn. Từ chế độ xem Hồ sơ, chọn Mã thông báo API và nhấp vào nút để thêm mã thông báo. Sau đó, mã thông báo sẽ cần được chỉ định trong tiêu đề 81 trong tất cả các yêu cầu như được hiển thị bên dưới 2API Webex của CiscoKhi làm việc với API Webex, phải tạo bot để lấy khóa API. Đầu tiên tạo một bot trong bảng điều khiển https. // nhà phát triển. webex. com/docs/. Khi tạo bot, bạn được cung cấp mã thông báo có giá trị sử dụng trong 100 năm. Sau đó, mã thông báo sẽ được đưa vào tiêu đề 81 trong tất cả các yêu cầu như được hiển thị bên dưới 4Tiêu đề mã thông báo tùy chỉnhMột số API yêu cầu cung cấp khóa API trong tiêu đề tùy chỉnh được bao gồm trong tất cả các yêu cầu. Khóa và định dạng sử dụng cho giá trị phải được nêu rõ trong tài liệu API Cisco MerakiCisco Meraki yêu cầu tất cả các yêu cầu phải có tiêu đề 88 với khóa API làm giá trị. Giống như phương pháp đã thảo luận trước đây, trước tiên bạn phải truy cập bảng điều khiển API và tạo khóa API. Điều này được thực hiện trong Bảng điều khiển Meraki trong cài đặt hồ sơ của bạn. Sau đó, khóa phải được chỉ định trong 88 cho tất cả các yêu cầu. 7Xác thực cơ bản HTTP w/Mã thông báoMột số API yêu cầu trước tiên bạn phải gửi HTTP POST cho url đăng nhập bằng Xác thực cơ bản HTTP. Sau đó, một mã thông báo phải được sử dụng cho các yêu cầu tiếp theo sẽ được cấp trong phản hồi. Loại xác thực này không yêu cầu phải truy cập cổng quản trị trước để tạo mã thông báo; Xác thực cơ bản HTTP/Mã thông báo - Trung tâm DNA của CiscoQuy trình đăng nhập Trung tâm DNA của Cisco yêu cầu trước tiên, một yêu cầu phải được gửi tới một URL đăng nhập bằng Xác thực cơ bản HTTP và sau khi xác thực thành công, sẽ phát hành một mã thông báo trong phản hồi. Sau đó, mã thông báo phải được gửi trong tiêu đề 30 trong các yêu cầu tiếp theo 9POST với Tải trọng JSONVới phương pháp xác thực này, trước tiên người dùng phải gửi POST tới URL đăng nhập và bao gồm JSON (phổ biến nhất), XML hoặc loại tải trọng khác có chứa thông tin đăng nhập của người dùng. Sau đó, một mã thông báo phải được sử dụng với các yêu cầu API tiếp theo sẽ được trả lại. Trong một số trường hợp, mã thông báo được trả lại dưới dạng cookie trong phản hồi. Trong trường hợp đó, một lối tắt là sử dụng một đối tượng 31. Bằng cách sử dụng đối tượng 32, mã thông báo trong cookie có thể dễ dàng được sử dụng lại cho các yêu cầu tiếp theo bằng cách tìm nguồn yêu cầu từ đối tượng 32. Đây là chiến lược được sử dụng trong ví dụ ACI của Cisco bên dướiPOST với Tải trọng JSON - Cisco ACICisco ACI yêu cầu tải trọng JSON được đăng lên điểm cuối URL 34 có bao gồm tên người dùng/mật khẩu. Phản hồi bao gồm một cookie có khóa 35 và một mã thông báo trong giá trị có thể được sử dụng cho các yêu cầu tiếp theo 0Kiểm tra chứng chỉLưu ý 36 trong ví dụ trên. Điều này có thể được sử dụng để tắt kiểm tra chứng chỉ khi thiết bị hoặc API bạn đang nhắm mục tiêu đang sử dụng chứng chỉ SSL tự ký hoặc không hợp lệ. Điều này sẽ tạo ra một thông báo tường trình tương tự như sau
Giải pháp nên được sử dụng để triển khai sản xuất là cài đặt chứng chỉ SSL hợp lệ và không sử dụng 36. Tuy nhiên, nếu bạn đang xử lý các thiết bị phòng thí nghiệm có thể không bao giờ có chứng chỉ hợp lệ thì có thể tắt thông báo bằng đoạn mã sau 1Xử lý lỗiSẽ rất hữu ích khi làm việc với 1 để hiểu mã trạng thái HTTP và một số trình kích hoạt phổ biến đối với chúng khi làm việc với API. Mã trạng thái HTTP cho biết yêu cầu thành công hay thất bại và khi xảy ra lỗi, có thể đưa ra gợi ý về vấn đề có thể xảy ra. Dưới đây là một số mã trạng thái HTTP phổ biến mà bạn có thể thấy khi làm việc với API và các nguyên nhân tiềm ẩn200 được. Yêu cầu đã thành công 201 đã tạo. Cho biết yêu cầu POST hoặc PUT đã thành công 204 Đã xóa. Cho biết một yêu cầu XÓA thành công 400 yêu cầu sai. Thường cho biết có sự cố với tải trọng trong trường hợp yêu cầu POST, PUT hoặc PATCH 401 trái phép. Thông tin đăng nhập không hợp lệ hoặc bị thiếu 403 cấm. Người dùng được xác thực không có quyền đối với tài nguyên được yêu cầu 404 không tìm thấy. URL không được công nhận 429 Yêu cầu quá nhiều. API có thể có hiệu lực giới hạn tốc độ. Kiểm tra tài liệu API để xem có giới hạn về số lượng yêu cầu mỗi giây hoặc mỗi phút không 500 Lỗi máy chủ nội bộ. Máy chủ gặp lỗi khi xử lý yêu cầu của bạn. Giống như 400, điều này cũng có thể do tải trọng không tốt trên POST, PUT hoặc PATCH Khi mô-đun 1 nhận được các mã trạng thái trên trong phản hồi, nó sẽ trả về một đối tượng phản hồi và điền vào các trường 20 và 21 trong đối tượng phản hồi. Nếu xảy ra lỗi kết nối, chẳng hạn như tên máy chủ không thể truy cập hoặc không thể giải quyết, thì 1 sẽ đưa ra một ngoại lệ. Tuy nhiên, theo mặc định, 1 sẽ không ném ngoại lệ đối với các lỗi dựa trên HTTP, chẳng hạn như lỗi 4XX và 5XX ở trên. Thay vào đó, nó sẽ trả về mã trạng thái lỗi và lý do trong phản hồi. Một chiến lược phổ biến trong việc xử lý lỗi là sử dụng phương thức 24 của đối tượng phản hồi để đưa ra một ngoại lệ cho các lỗi dựa trên HTTP. Sau đó, một khối Python 25 có thể được sử dụng để bắt bất kỳ lỗi nào và cung cấp thông báo lỗi thân thiện với con người hơn cho người dùng, nếu muốn
2Đối tượng API CRUD (Tạo, Thay thế, Cập nhật, Xóa)Cho đến nay, chúng ta đã thảo luận chủ yếu về việc truy xuất dữ liệu từ API bằng cách sử dụng các yêu cầu HTTP GET. Khi tạo/cập nhật đối tượng, HTTP POST, PUT và PATCH được sử dụng. Một yêu cầu XÓA sẽ được sử dụng để xóa các đối tượng khỏi API
Cần lưu ý rằng một số API hỗ trợ cả PUT và PATCH, trong khi một số API khác có thể chỉ hỗ trợ PUT hoặc chỉ PATCH. API Meraki mà chúng tôi sẽ sử dụng cho ví dụ sau chỉ hỗ trợ các yêu cầu PUT để thay đổi đối tượng BƯU KIỆNKhi sử dụng yêu cầu POST với API, thông thường bạn phải gửi tải trọng cùng với yêu cầu theo định dạng mà API yêu cầu (thường là JSON, đôi khi là XML, rất hiếm khi là định dạng khác). Định dạng cần thiết cho tải trọng phải được ghi lại trong đặc tả API. Khi sử dụng định dạng 27, bạn có thể chỉ định đối số 20 khi thực hiện lệnh gọi tới 29. Ví dụ, 40. Các loại tải trọng khác, chẳng hạn như 41 sẽ sử dụng đối số 42. Ví dụ, 43Tạo Vùng trong NautobotVới Nautobot, chúng tôi có thể xác định tải trọng cần thiết bằng cách xem tài liệu Swagger có trên chính hệ thống tại 44. Hãy xem thông số Swagger để tạo một 45 trong NautobotCác trường được đánh dấu * màu đỏ ở trên cho biết đó là các trường bắt buộc, các trường khác là tùy chọn. Nếu chúng tôi nhấp vào nút Dùng thử như hình trên, nó sẽ cung cấp cho chúng tôi tải trọng mẫu Vì 46 và 47 là các trường bắt buộc duy nhất, chúng tôi có thể tạo một tải trọng từ ví dụ bỏ qua các trường khác nếu muốn. Đoạn mã dưới đây cho thấy cách chúng ta có thể tạo Khu vực trong Nautobot bằng cách sử dụng 29 3VÁMột yêu cầu 49 có thể được sử dụng để cập nhật một thuộc tính của một đối tượng. Ví dụ: trong đoạn mã tiếp theo này, chúng tôi sẽ thay đổi mô tả của Khu vực mà chúng tôi vừa tạo trong yêu cầu 70. Nó đã bị bỏ qua trong yêu cầu 70 trước đó nên hiện tại nó là một chuỗi trống. Mặc dù nó không được gọi ra trong đặc tả API Swagger, yêu cầu 49 cho Nautobot yêu cầu trường 73 được xác định trong tải trọng. Có thể tra cứu 73 cho Khu vực đã tạo trước đây của chúng tôi bằng cách thực hiện 75 trên 76. 77 ở cuối URL là một tham số truy vấn được sử dụng để lọc yêu cầu đối với các đối tượng có trường khớp với một giá trị cụ thể. Trong trường hợp này, chúng tôi đã lọc các đối tượng cho đối tượng có trường 47 được đặt thành 79 để lấy ID. Ngoài ra, tải trọng phải ở dạng danh sách từ điển chứ không phải là một từ điển đơn lẻ như trong ví dụ về SwaggerCập nhật Mô tả Khu vực trong Nautobot 4ĐẶTYêu cầu 90 thường được sử dụng để thay thế toàn bộ đối tượng bao gồm tất cả các thuộc tính của đối tượngThay thế đối tượng vùng trong NautobotGiả sử chúng ta muốn thay thế toàn bộ đối tượng Vùng mà chúng ta đã tạo trước đó, đặt cho nó một tên, sên và mô tả hoàn toàn mới. Đối với điều này, chúng tôi có thể sử dụng yêu cầu 90, chỉ định 73 của Khu vực đã tạo trước đó và cung cấp các giá trị mới cho các thuộc tính tên, sên và mô tả 5Kích hoạt SSID trong MerakiHãy xem một ví dụ khác về việc sử dụng 90 để kích hoạt SSID không dây trong bảng điều khiển Cisco Meraki. Đối với điều này, chúng tôi sẽ sử dụng yêu cầu 90 bao gồm tải trọng JSON thích hợp để bật SSID 14 6XÓA BỎCó thể xóa một đối tượng bằng cách thực hiện yêu cầu 95 tới URI (Chỉ báo tài nguyên chung) của một đối tượng. URI là một phần của URL đề cập đến đối tượng, ví dụ: 96 trong trường hợp Vùng NautobotXóa Vùng khỏi NautobotHãy tiếp tục và xóa Khu vực mà chúng tôi đã thêm trước đó. Để làm điều đó, chúng tôi sẽ gửi yêu cầu 95 tới URI của khu vực. Có thể nhìn thấy URI khi thực hiện yêu cầu 98 trong thuộc tính 99 của đối tượng Khu vực. Chúng ta cũng có thể thấy trong đặc tả API cho 95 rằng lệnh gọi phải được thực hiện tới 01 7Giới hạn tỷ lệMột số API triển khai cơ chế điều chỉnh để ngăn hệ thống bị quá tải với các yêu cầu. Điều này thường được triển khai dưới dạng giới hạn tốc độ của X số lượng yêu cầu mỗi phút. Khi đạt đến giới hạn tốc độ, API sẽ trả về mã trạng thái 02. Để giải quyết vấn đề này, mã của bạn phải triển khai bộ đếm thời gian dự phòng để tránh chạm ngưỡng. Dưới đây là một ví dụ về giới hạn tốc độ của Trung tâm DNA của Cisco là 5 yêu cầu mỗi phút 8phân trangMột số lệnh gọi API có thể đặt giới hạn về số lượng đối tượng được trả về trong một lệnh gọi. Trong trường hợp này, API sẽ trả về chi tiết phân trang trong nội dung JSON, bao gồm cả URL để yêu cầu tập hợp dữ liệu tiếp theo cũng như tập hợp trước đó. Nếu Trước đó trống, chúng tôi đang ở tập dữ liệu đầu tiên. Nếu Tiếp theo trống, chúng tôi biết rằng chúng tôi đã đến cuối tập dữ liệu. Một số triển khai API tuân theo RFC5988, bao gồm tiêu đề Liên kết ở định dạng liên kết. https. //webexapis. com/v1/people?displayName=Harold&max=10&before&after=Y2lzY29zcGFyazovL3VzL1BFT1BMRS83MTZlOWQxYy1jYTQ0LTRmZWQtOGZjYS05ZGY0YjRmNDE3ZjU; Ví dụ trên là từ API Webex, triển khai RFC5988. Điều này được mô tả trong tài liệu API tại đây. https. // nhà phát triển. webex. com/docs/api/cơ bản Tuy nhiên, hãy nhớ rằng không phải tất cả các triển khai đều sử dụng RFC. Tài liệu API sẽ giải thích cách xử lý phân trang Xử lý phân trang trong NautobotCó thể thấy một ví dụ điển hình về phân trang khi thực hiện yêu cầu 98 để truy xuất tất cả Thiết bị từ Nautobot. Nautobot bao gồm thuộc tính 04, 05 và 06 trong các phản hồi được phân trang. Theo mặc định, API sẽ trả về tối đa 50 bản ghi. Giá trị giới hạn cũng như giá trị bù được chỉ định trong giá trị 05 của phản hồi. Ví dụ. 08. Trong URL, giới hạn cho biết số lượng bản ghi tối đa và phần bù cho biết vị trí bắt đầu của loạt bản ghi tiếp theo. Thuộc tính 06 cho biết url của tập bản ghi trước đó. Nếu 06 là Không, điều đó có nghĩa là chúng tôi đang ở trong nhóm hồ sơ đầu tiên. Và nếu 05 là Không, điều đó có nghĩa là chúng tôi đang ở trong nhóm hồ sơ cuối cùngTrong đoạn mã dưới đây, trước tiên chúng tôi truy xuất bộ 50 bản ghi đầu tiên và lưu trữ chúng trong một biến 12. Sau đó, chúng tôi tạo một vòng lặp 13 lặp lại cho đến khi trường 05 trong phản hồi chứa Không có. Các kết quả trả về được thêm vào 12 ở mỗi lần lặp lại vòng lặp. Cuối cùng, chúng ta có thể thấy rằng có 511 thiết bị, có cùng giá trị với trường 04 trong phản hồi 9Xử lý phân trang trong Cisco WebexTrong mã bên dưới, trước tiên, chúng tôi lấy ID phòng cho các phòng Nhóm WebEx mà tôi là thành viên. Sau đó, chúng tôi truy xuất các thành viên từ phòng Câu hỏi hỗ trợ dành cho nhà phát triển DevNet và tạo một chức năng liên tục theo URL liên kết và hiển thị nội dung. Vòng lặp While bị hỏng khi tiêu đề Liên kết không còn nữa, trả về Không có khi chúng tôi cố truy xuất nó bằng tiêu đề. nhận được liên kết') 0kết thúcTôi hy vọng đây là một hướng dẫn hữu ích về cách sử dụng 1 để làm việc với API REST của nhà cung cấp. Mặc dù không có hai cách triển khai API nào giống nhau, nhưng nhiều mẫu phổ biến nhất để làm việc với chúng được đề cập ở đây. Như mọi khi, hãy liên hệ với chúng tôi trong các nhận xét hoặc trên kênh Slack công khai của chúng tôi nếu có bất kỳ câu hỏi nào. Cảm ơn vì đã đọc
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 để tìm nạp API trong Python?Các bước lấy dữ liệu từ API bằng Python . Kết nối với một API. Lúc đầu, chúng tôi cần kết nối với API và tạo kết nối an toàn như hình bên dưới–. Lấy dữ liệu từ API. . Phân tích dữ liệu thành định dạng JSON. . Trích xuất dữ liệu và in nó Chúng ta có thể gọi API bằng Python không?Để làm việc với 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.
API yêu cầu là gì?Các yêu cầu API đã được xác định
. Phương thức chỉ ra hành động bạn muốn API thực hiện. Dưới đây là một số phương pháp phổ biến nhất. GET lấy dữ liệu từ một API. POST gửi dữ liệu mới tới API. A request includes the URL of the API endpoint and an HTTP request method. The method indicates the action you want the API to perform. Here are some of the most common methods: GET retrieves data from an API. POST sends new data to an API. |