Hướng dẫn which python package is used for making http requests? - gói python nào được sử dụng để thực hiện các yêu cầu http?
Có một số lượng lớn máy khách HTTP có sẵn cho Python - một tìm kiếm nhanh cho các máy khách Python HTTP trên GitHub trả về kết quả hơn 1.700 (!). Nhưng làm thế nào để bạn có ý nghĩa của tất cả chúng và tìm thấy một thứ phù hợp với trường hợp sử dụng cụ thể của bạn?Python HTTP Clients on Github returns over 1,700(!) results. But how do you make sense of all of them and find one which is right for your particular use case? Show
Bạn có một máy duy nhất theo ý của bạn hoặc một bộ sưu tập chúng? Bạn có muốn giữ mọi thứ đơn giản hay là hiệu suất thô hơn là một mối quan tâm? Một ứng dụng web, sẽ thực hiện yêu cầu thường xuyên cho API dịch vụ vi mô sẽ có các yêu cầu khá khác với tập lệnh liên tục cạo dữ liệu. Ngoài ra, có mối quan tâm liệu thư viện bạn chọn vẫn sẽ vẫn còn khoảng sáu tháng nữa. Trong bài viết này, chúng tôi sẽ đề cập đến năm khách hàng HTTP tốt nhất hiện có sẵn cho Python và chi tiết tại sao mỗi người trong số họ có thể là một để bạn xem xét. Giới thiệuĐối với tất cả các ví dụ ở đây, tôi sẽ nhận được yêu cầu cho API Star Wars (swapi.dev), trả về dữ liệu về con người, hành tinh và dữ liệu từ vũ trụ Star Wars. Bạn có thể thấy một ví dụ về phản hồi JSON từ nó dưới đây:
Các ví dụ yêu cầu POST ở đây là httpbin.org, một công cụ kiểm tra nhà phát triển đáp ứng với nội dung của yêu cầu, bạn cũng có thể sử dụng requestbin.com nếu bạn thích. Chúng tôi sẽ gửi dữ liệu bài đăng JSON sau đây về OBI WAN:
Những thứ cơ bảnNếu bạn quen thuộc với thư viện tiêu chuẩn của Python, có lẽ bạn đã biết về lịch sử khó hiểu của các mô -đun Urllib và Urllib2 trong đó. Urllib2 (mô -đun ban đầu) được chia thành các mô -đun riêng biệt trong Python 3, Urllib.Request và Urllib.error. Để so sánh các mục đích với các gói trong phần còn lại của bài viết này, trước tiên chúng ta hãy xem cách chúng ta thực hiện yêu cầu không sử dụng gì ngoài thư viện tiêu chuẩn. Tất cả các ví dụ của chúng tôi theo sau sử dụng Python 3
Lưu ý cách chúng tôi đã phải sử dụng mô -đun JSON để chuyển đổi nó thành JSON, vì 0 trả về một chuỗi.Bài viết của chúng tôi sẽ trông như thế này:
Chúng tôi cũng đã phải mã hóa dữ liệu chúng tôi muốn gửi và đặt loại nội dung tiêu đề mà chúng tôi cần cập nhật nếu chúng tôi gửi dữ liệu biểu mẫu chẳng hạn. Bạn có thể cảm thấy điều này thật khó hiểu - "Tất cả những gì tôi muốn là lấy một số dữ liệu!". Chà, đây dường như có bao nhiêu nhà phát triển khác cũng cảm thấy, được đưa ra với một số máy khách HTTP có sẵn dưới dạng các gói bổ sung. Trong phần còn lại của bài viết, chúng ta sẽ xem xét một vài lựa chọn tốt. Các thư viện1. Urllib3
Gói Urllib3, khá khó hiểu, không phải là một phần của thư viện tiêu chuẩn, mà là gói máy khách HTTP riêng biệt được xây dựng trên Urllib. Nó cung cấp các tính năng còn thiếu như gộp kết nối, xác minh TLS và an toàn luồng. Điều này cuối cùng dẫn đến hiệu suất tốt hơn cho các ứng dụng thực hiện nhiều cuộc gọi như quét web, vì chúng sẽ sử dụng lại các kết nối với máy chủ thay vì tạo các ứng dụng mới. Urllibs3 thực sự là sự phụ thuộc của các máy khách HTTP được đề cập sau trong bài viết này và nhận được hơn 150 triệu lượt tải xuống mỗi tháng. Để thực hiện yêu cầu bằng Urllib3, chúng tôi sẽ thực hiện cuộc gọi với nó như sau:
Như với thư viện tiêu chuẩn, chúng tôi đã phải tự chuyển đổi nó thành JSON vì Urllib3 khiến chúng tôi làm mọi việc theo cách thủ công. Đối với các yêu cầu POST, chúng tôi cũng cần mã hóa thủ công các tham số truy vấn hoặc trường JSON:
1 cung cấp cho chúng tôi một đối tượng Trình quản lý nhóm, xử lý kết nối gộp và an toàn luồng. Các yêu cầu tiếp theo được thực hiện với phương thức 2 của phiên bản trình quản lý và cung cấp cho nó phương thức HTTP và URL mong muốn. Các kết nối với một tên máy chủ cụ thể được lưu trữ/duy trì trong nền và sẽ được sử dụng lại khi áp dụng. Vì lý do đó, chúng tôi cũng muốn đảm bảo định cấu hình 3 với số lượng tên máy chủ phù hợp mà chúng tôi sẽ kết nối.Urllib3 cũng cung cấp hành vi thử lại phức tạp. Đây là một cân nhắc thực sự quan trọng - chúng tôi không muốn kết nối của chúng tôi đến thời gian chờ do một máy chủ quá tải một lần ngẫu nhiên và sau đó chỉ cần bỏ cuộc. Chúng tôi muốn thử nhiều lần trước khi chúng tôi xem xét dữ liệu không có sẵn. Bạn có thể tìm thêm chi tiết về chủ đề này trong tài liệu Urllib3. Nhược điểm của việc sử dụng gộp kết nối của Urllib3 là nó gây khó khăn cho việc làm việc với cookie vì nó không phải là một khách hàng trạng thái. Chúng tôi phải đặt thủ công các giá trị tiêu đề này theo yêu cầu thay vì hỗ trợ trực tiếp bởi Urllib3 hoặc sử dụng một cái gì đó như mô -đun HTTP.Cookies để quản lý chúng cho chúng tôi. Ví dụ:
Cho rằng rất nhiều thư viện khác phụ thuộc vào Urllib3, có khả năng nó sẽ tồn tại trong một thời gian tới. 2. Yêu cầu
Gói yêu cầu rất được ưa chuộng trong cộng đồng Python, thu được hơn 110m tải xuống mỗi tháng theo Pepy. Nó cũng được khuyến nghị là "Giao diện máy khách HTTP cấp cao hơn" bởi tài liệu Urllib.Request chính. Làm việc với các yêu cầu rất đơn giản và, do đó, phần lớn các nhà phát triển trong cộng đồng Python sử dụng nó làm ứng dụng khách HTTP của họ. Nó được duy trì bởi Quỹ phần mềm Python với hơn 45k sao trên GitHub và sự phụ thuộc của nhiều thư viện Python khác, như GRPC và Pandas. Hãy xem lại cách chúng tôi thực hiện các yêu cầu của chúng tôi, tốt, yêu cầu:
Tương tự, dữ liệu đăng bài cũng được thực hiện đơn giản - chúng ta chỉ cần thay đổi cuộc gọi phương thức GET của mình thành 4:
Ở đây bạn có thể thấy tại sao các yêu cầu rất phổ biến - thiết kế của nó thật thanh lịch! Ví dụ ở đây là ngắn gọn nhất và yêu cầu mã ít nhất của tất cả các ví dụ được đưa ra cho đến nay. Yêu cầu kết hợp các động từ HTTP dưới dạng các phương thức (GET, POST) và chúng tôi thậm chí có thể chuyển đổi thẳng sang JSON mà không phải viết phương thức giải mã của riêng mình. Là một nhà phát triển, điều này có nghĩa là nó đã chết đơn giản để làm việc và hiểu, chỉ với hai cuộc gọi phương thức cần thiết để có được dữ liệu chúng tôi muốn từ API của chúng tôi. Trong ví dụ bài đăng của chúng tôi, chúng tôi cũng không phải bận tâm đến việc mã hóa từ điển dữ liệu của chúng tôi hoặc lo lắng về việc thiết lập loại nội dung chính xác trong các tiêu đề yêu cầu. Yêu cầu làm tất cả những điều đó cho chúng tôi. Cảm ơn rất nhiều, yêu cầu!Requests does all that for us. Thanks a lot, Requests! Thật dễ dàng để sửa đổi cuộc gọi bài đăng của chúng tôi để gửi dữ liệu biểu mẫu thay vào đó bằng cách thay thế đối số 5 của chúng tôi bằng 6.Một ví dụ khác về tính đơn giản của nó là cách chúng ta có thể đặt cookie chỉ là một đối số bổ sung trên phương thức POST. Ví dụ:
Yêu cầu cũng cung cấp một loạt các tính năng nâng cao khác như Phiên, Hook yêu cầu và chiến lược thử lại tùy chỉnh. Các phiên cho phép trạng thái trạng thái với cookie được duy trì qua các yêu cầu, một cái gì đó Urllib3 không cung cấp ngoài hộp. Một ví dụ phiên được lấy từ tài liệu yêu cầu: 0Ở đây, chúng tôi đã khởi tạo một đối tượng phiên và sử dụng nó để gửi hai yêu cầu 7. Bất kỳ cookie nào chúng tôi nhận được từ máy chủ đều được quản lý bởi đối tượng phiên và - tự động - được gửi lại cho máy chủ theo các yêu cầu tiếp theo.Ngoài ra, móc cho phép bạn đăng ký hành vi chung mà bạn muốn thực thi sau mỗi cuộc gọi. Bạn có thể quen thuộc với khái niệm này nếu bạn sử dụng Git, cho phép bạn làm điều tương tự. Bạn có thể kiểm tra tất cả các tính năng nâng cao trong tài liệu của các yêu cầu. Đưa ra tất cả các yêu cầu Các tính năng nâng cao có nghĩa là một lựa chọn vững chắc cho nhiều ứng dụng. 3. Aiohttp
AIOHTTP là gói chứa cả khung máy khách và máy chủ, có nghĩa là nó có thể phù hợp với API cũng cung cấp các yêu cầu ở nơi khác. Nó có 11k sao trên GitHub và một số thư viện của bên thứ ba được xây dựng dựa trên nó. Chạy yêu cầu Star Wars thông thường của chúng tôi với AIOHTTP sẽ là: 1Và yêu cầu bài đăng của chúng tôi: 2Bạn có thể thấy rằng đối tượng 8 sử dụng cú pháp tương tự cho các yêu cầu, nhưng mã tổng thể phức tạp hơn rất nhiều so với các ví dụ trước và hiện chúng tôi có các cuộc gọi phương thức sử dụng 9 và 0 cùng với nhập mô -đun bổ sung cho 1. Tài liệu AIOHTTP cung cấp một cái nhìn tổng quan tốt về lý do tại sao tất cả các mã bổ sung này là cần thiết so với các yêu cầu nói.Sẽ mất một thời gian để hiểu các khái niệm lập trình không đồng bộ nếu bạn không quen thuộc với chúng, nhưng điều cuối cùng có nghĩa là có thể đưa ra một số yêu cầu cùng một lúc mà không chờ đợi mỗi lần trả lời một phản hồi. Đối với các tình huống mà chúng tôi chỉ đưa ra một yêu cầu, điều này có thể không phải là một mối quan tâm, nhưng nếu chúng tôi cần thực hiện hàng chục hoặc thậm chí hàng ngàn yêu cầu, tất cả thời gian CPU đang chờ phản hồi có thể được chi tiêu tốt hơn lời yêu cầu!). Chúng tôi không muốn trả tiền cho các chu kỳ CPU khi chúng tôi chỉ chờ đợi xung quanh. Ví dụ, chúng ta hãy xem một số mã tìm kiếm dữ liệu cho 50 starship đầu tiên từ API Star Wars. 3Trước tiên, chúng tôi sử dụng phương thức 2 của Asyncio để chạy chức năng Async 3 của chúng tôi và nơi chúng tôi sử dụng vòng lặp để chạy 50 yêu cầu của chúng tôi. Thông thường, điều này có nghĩa là chúng tôi chạy 50 yêu cầu này từng người một và chờ hoàn thành trước khi chúng tôi bắt đầu ứng dụng tiếp theo. Tuy nhiên, với Asyncio và Aiohttp, chúng tôi có các chức năng "async" chạy không đồng bộ và ngay lập tức trở lại với giá trị trong tương lai. Chúng tôi lưu trữ các giá trị này trong danh sách nhiệm vụ của chúng tôi và cuối cùng chờ với 4 để tất cả chúng hoàn thành.Điều này liên tục mất dưới 2 giây để chạy trên máy của tôi, trong khi yêu cầu cùng một dữ liệu bằng cách sử dụng phiên với các yêu cầu chỉ mất hơn 4 giây. Vì vậy, chúng tôi có thể tăng tốc thời gian cần thiết để truy xuất dữ liệu của chúng tôi nếu chúng tôi có thể xử lý sự phức tạp bổ sung mà nó giới thiệu cho mã của chúng tôi. AIOHTTP cung cấp tài liệu kỹ lưỡng cùng với một loạt các tính năng nâng cao như phiên, cookie, nhóm, bộ nhớ đệm DNS và truy tìm máy khách. Tuy nhiên, một khu vực vẫn còn thiếu, tuy nhiên là hỗ trợ cho hành vi thử lại phức tạp, chỉ có sẵn thông qua các mô -đun của bên thứ ba. 4. GrequestsGrequests giới thiệu Gevent - một "thư viện mạng Python dựa trên Coroutine" - để yêu cầu cho phép các yêu cầu được thực hiện không đồng bộ. Đó là một thư viện cũ hơn, lần đầu tiên được phát hành vào năm 2012, không sử dụng mô -đun 1 tiêu chuẩn của Python. Các yêu cầu riêng lẻ có thể được thực hiện như chúng tôi sẽ làm với các yêu cầu, nhưng chúng tôi cũng có thể tận dụng mô -đun Gevent để thực hiện một số yêu cầu như vậy: 4Tài liệu Grequests là một chút thưa thớt và thậm chí còn đi xa để giới thiệu các thư viện khác trên trang GitHub của nó. Chỉ với 165 dòng mã, nó không cung cấp bất kỳ chức năng nâng cao nào so với các yêu cầu. Trong chín năm, nó đã có tổng cộng sáu bản phát hành, vì vậy có lẽ chỉ thực sự đáng để xem xét nếu bạn thấy chương trình không đồng bộ đặc biệt khó hiểu. 5. HTTPXHTTPX cung cấp "API tương thích yêu cầu rộng rãi", là thư viện duy nhất trong danh sách của chúng tôi để cung cấp hỗ trợ HTTP 2.0 và cũng cung cấp API ASYNC. Sử dụng httpx rất giống với các yêu cầu: 5Và cho yêu cầu bài đăng của chúng tôi: 6Chúng tôi chỉ đơn giản là thay đổi tên của mô -đun của chúng tôi và vẫn không phải quản lý bất kỳ chuyển đổi JSON nào. Trong ví dụ của chúng tôi, chúng tôi sử dụng phương pháp đồng bộ, nhưng cũng có thể đã chọn một phiên bản không đồng bộ, chỉ bằng cách sử dụng 6. Ở đây, mã khá giống với ví dụ trước đây của chúng tôi cho AIOHTTP: 7Đối với các yêu cầu mất một thời gian để trả lời phản hồi, điều này một lần nữa có nghĩa là khách hàng của chúng tôi không phải chờ đợi. Nó chắc chắn đáng để xem xét nếu bạn có một số lượng lớn các yêu cầu bạn cần thực hiện đồng thời và muốn tiết kiệm các chu kỳ CPU. Nếu bạn cũng đang tìm cách tái cấu trúc các tập lệnh dựa trên các yêu cầu cho một cái gì đó không đồng bộ, thì HTTPX dường như là một sự thay thế tốt. 6. Đường lênĐường lên là thư viện gần đây nhất trong danh sách của chúng tôi ở đây và tuân theo cách tiếp cận hơi khác so với các thư viện khác của chúng tôi, vì nó không tập trung chủ yếu vào các yêu cầu HTTP tùy ý, mà là các luồng yêu cầu có cấu trúc nghỉ ngơi điển hình, với các mẫu đường dẫn (tuyến đường) và phần còn lại thông số.REST-structured request flows, with path patterns (routes) and REST parameters. Theo mặc định, Uplink đang sử dụng thư viện yêu cầu nổi tiếng của chúng tôi để lắp ráp yêu cầu HTTP thực tế, tuy nhiên, nó cũng có tính năng hỗ trợ cho AIOHTTP và xoắn, nếu bạn thích các yêu cầu không đồng bộ. Theo nghĩa đó, nó không phải là một ứng dụng khách HTTP thích hợp, mà là một trình bao bọc tiện lợi hơn xung quanh các máy khách HTTP hiện có.not so much a proper HTTP client itself, but more a convenience wrapper around existing HTTP clients. Để thực hiện một lần nữa ví dụ cơ bản nhất của chúng tôi 8Những gì chúng tôi đã làm ở đây là
Voilà, chúng tôi có một lớp Python nhẹ với một phương pháp được đặt tên một cách khéo léo và có thể gửi yêu cầu của chúng tôi mà không phải giải quyết các chi tiết HTTP thực tế., we have a lightweight Python class with an aptly named method and could send our request without having to deal with the actual HTTP details. Nó tương tự cho ví dụ bài đăng của chúng tôi, trong đó chúng tôi chỉ định một trình trang trí 5 để chỉ ra một yêu cầu bài đăng và xác định đường dẫn/tuyến đường. Ngoài ra, chúng tôi sử dụng trình trang trí 6 để chỉ ra rằng tham số 6 của chúng tôi nên được sử dụng làm thân JSON cho yêu cầu HTTP.POST example, where we specify a 5 decorator to indicate a POST request and define the path/route. Additionally, we use a 6 decorator to indicate that our 6
parameter should be used as JSON body for the HTTP request. 9Một lần nữa, đó là khá nhiều và chỉ với một vài dòng mã, chúng tôi đã quản lý để tạo một lớp cho phép chúng tôi truy cập giao diện nghỉ ngơi theo kiểu Python gốc, mà không cần phải tự xử lý HTTP. So sánh tính năngTất cả các thư viện trong danh sách của chúng tôi, tất nhiên, đi kèm với chức năng cơ bản tương tự của việc soạn thảo và gửi yêu cầu HTTP. Về vấn đề này, tất cả đều khá giống nhau và hỗ trợ cùng một bộ tính năng cơ bản (nghĩa là hỗ trợ cho SSL và proxy). Trường hợp chúng khác nhau là các khu vực tiên tiến hơn của Python và HTTP, chẳng hạn như hỗ trợ cho việc gọi yêu cầu không đồng bộ, hỗ trợ phiên giao dịch chéo và các phiên bản HTTP hiện đại. Đặc biệt, cái sau là (kể từ bây giờ) độc quyền của HTTPX, đây là thư viện Python duy nhất trong danh sách của chúng tôi với sự hỗ trợ cho HTTP/2.
Grequests 288k 4KHttpx 9m 8,8k
214m 47,5k Đường lên Mô -đun nào trong Python giúp bạn thực hiện các yêu cầu HTTP?Mô -đun yêu cầu cho phép bạn gửi các yêu cầu HTTP bằng Python.Yêu cầu HTTP trả về một đối tượng phản hồi với tất cả dữ liệu phản hồi (nội dung, mã hóa, trạng thái, v.v.). allows you to send HTTP requests using Python. The HTTP request returns a Response Object with all the response data (content, encoding, status, etc).
Thư viện Python nào làm cho yêu cầu HTTP rất dễ dàng từ Python?Các thư viện trong Python để thực hiện yêu cầu HTTP Có nhiều thư viện để thực hiện yêu cầu HTTP trong Python, đó là HTTPLIB, Urllib, HTTPLIB2, Treq, v.v.httplib, urllib, httplib2 , treq, etc., but requests are the simplest and most well-documented libraries among them all.
Mô -đun Python nào được sử dụng để tương tác với giao thức HTTP?Urllib là một mô -đun được tích hợp trong thư viện tiêu chuẩn Python và sử dụng HTTP.Máy khách thực hiện phía máy khách của các giao thức HTTP và HTTPS. is a module built into the Python standard library and uses http. client which implements the client side of HTTP and HTTPS protocols.
Gói yêu cầu có đi kèm với Python không?Yêu cầu là một trong những thư viện Python phổ biến nhất không được bao gồm trong Python.not included with Python. |