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?

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:

{
  "name": "Death Star",
  "model": "DS-1 Orbital Battle Station",
  "manufacturer": "Imperial Department of Military Research, Sienar Fleet Systems",
  "cost_in_credits": "1000000000000",
  ...
}
// Now I know which manufacturer I won't be asking to make my own Death Star.

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:

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}

Những thứ cơ bản

Nế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

import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))

Lưu ý cách chúng tôi đã phải sử dụng mô -đun JSON để chuyển đổi nó thành JSON, vì

import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
0 trả về một chuỗi.

Bài viết của chúng tôi sẽ trông như thế này:

import json
from urllib import request, parse

data = {"name": "Obi-Wan Kenobi", ...}

encoded_data = json.dumps(data).encode()

req = request.Request('https://httpbin.org/post', data=encoded_data)
req.add_header('Content-Type', 'application/json')
response = request.urlopen(req)

text = response.read()

print(json.loads(text.decode('utf-8')))

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ện

1. Urllib3

Urllib3 là một máy khách HTTP mạnh mẽ, thân thiện với người dùng cho Python. Phần lớn hệ sinh thái Python đã sử dụng urllib3 và bạn cũng nên. Urllib3 mang đến nhiều tính năng quan trọng bị thiếu trong thư viện tiêu chuẩn Python.

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:

import urllib3
import json

http = urllib3.PoolManager()
r = http.request('GET', 'https://swapi.dev/api/starships/9/')

print(json.loads(r.data.decode('utf-8')))

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:

import json
import urllib3

data = {"name": "Obi-Wan Kenobi", ...}

http = urllib3.PoolManager()

encoded_data = json.dumps(data).encode('utf-8')

r = http.request(
    'POST',
    'https://httpbin.org/post',
    body=encoded_data,
    headers={'Content-Type': 'application/json'}
)

print(json.loads(r.data.decode('utf-8')))

import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
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
import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
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
import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
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ụ:

headers={'Cookie': 'foo=bar; hello=world'}

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

Yêu cầu là một thư viện HTTP thanh lịch và đơn giản cho Python, được xây dựng cho con người.

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:

import requests

r = requests.get('https://swapi.dev/api/starships/9/')

print(r.json())

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

import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
4:

import requests

data = {"name": "Obi-Wan Kenobi", ...}

r = requests.post('https://httpbin.org/post', json=data)

print(r.json())

Ở đâ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ố

import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
5 của chúng tôi bằng
import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
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ụ:

r = requests.post('https://httpbin.org/post', data=data, cookies={'foo': 'bar', 'hello': 'world'}))

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:

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}
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

import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
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

Máy khách/máy chủ HTTP không đồng bộ cho Asyncio và Python.

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à:

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}
1

Và yêu cầu bài đăng của chúng tôi:

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}
2

Bạn có thể thấy rằng đối tượng

import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
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
import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
9 và
import json
from urllib import request, parse

data = {"name": "Obi-Wan Kenobi", ...}

encoded_data = json.dumps(data).encode()

req = request.Request('https://httpbin.org/post', data=encoded_data)
req.add_header('Content-Type', 'application/json')
response = request.urlopen(req)

text = response.read()

print(json.loads(text.decode('utf-8')))
0 cùng với nhập mô -đun bổ sung cho
import json
from urllib import request, parse

data = {"name": "Obi-Wan Kenobi", ...}

encoded_data = json.dumps(data).encode()

req = request.Request('https://httpbin.org/post', data=encoded_data)
req.add_header('Content-Type', 'application/json')
response = request.urlopen(req)

text = response.read()

print(json.loads(text.decode('utf-8')))
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.

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}
3

Trước tiên, chúng tôi sử dụng phương thức

import json
from urllib import request, parse

data = {"name": "Obi-Wan Kenobi", ...}

encoded_data = json.dumps(data).encode()

req = request.Request('https://httpbin.org/post', data=encoded_data)
req.add_header('Content-Type', 'application/json')
response = request.urlopen(req)

text = response.read()

print(json.loads(text.decode('utf-8')))
2 của Asyncio để chạy chức năng Async
import json
from urllib import request, parse

data = {"name": "Obi-Wan Kenobi", ...}

encoded_data = json.dumps(data).encode()

req = request.Request('https://httpbin.org/post', data=encoded_data)
req.add_header('Content-Type', 'application/json')
response = request.urlopen(req)

text = response.read()

print(json.loads(text.decode('utf-8')))
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
import json
from urllib import request, parse

data = {"name": "Obi-Wan Kenobi", ...}

encoded_data = json.dumps(data).encode()

req = request.Request('https://httpbin.org/post', data=encoded_data)
req.add_header('Content-Type', 'application/json')
response = request.urlopen(req)

text = response.read()

print(json.loads(text.decode('utf-8')))
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. Grequests

Grequests 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

import json
from urllib import request, parse

data = {"name": "Obi-Wan Kenobi", ...}

encoded_data = json.dumps(data).encode()

req = request.Request('https://httpbin.org/post', data=encoded_data)
req.add_header('Content-Type', 'application/json')
response = request.urlopen(req)

text = response.read()

print(json.loads(text.decode('utf-8')))
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:

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}
4

Tà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. HTTPX

HTTPX 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:

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}
5

Và cho yêu cầu bài đăng của chúng tôi:

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}
6

Chú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

import json
from urllib import request, parse

data = {"name": "Obi-Wan Kenobi", ...}

encoded_data = json.dumps(data).encode()

req = request.Request('https://httpbin.org/post', data=encoded_data)
req.add_header('Content-Type', 'application/json')
response = request.urlopen(req)

text = response.read()

print(json.loads(text.decode('utf-8')))
6. Ở đây, mã khá giống với ví dụ trước đây của chúng tôi cho AIOHTTP:

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}
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

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}
8

Những gì chúng tôi đã làm ở đây là

  1. Tạo một lớp
    import json
    from urllib import request, parse
    
    data = {"name": "Obi-Wan Kenobi", ...}
    
    encoded_data = json.dumps(data).encode()
    
    req = request.Request('https://httpbin.org/post', data=encoded_data)
    req.add_header('Content-Type', 'application/json')
    response = request.urlopen(req)
    
    text = response.read()
    
    print(json.loads(text.decode('utf-8')))
    
    7, dựa trên lớp cơ sở
    import json
    from urllib import request, parse
    
    data = {"name": "Obi-Wan Kenobi", ...}
    
    encoded_data = json.dumps(data).encode()
    
    req = request.Request('https://httpbin.org/post', data=encoded_data)
    req.add_header('Content-Type', 'application/json')
    response = request.urlopen(req)
    
    text = response.read()
    
    print(json.loads(text.decode('utf-8')))
    
    8 của Uplink.
  2. Thêm một phương thức giả
    import json
    from urllib import request, parse
    
    data = {"name": "Obi-Wan Kenobi", ...}
    
    encoded_data = json.dumps(data).encode()
    
    req = request.Request('https://httpbin.org/post', data=encoded_data)
    req.add_header('Content-Type', 'application/json')
    response = request.urlopen(req)
    
    text = response.read()
    
    print(json.loads(text.decode('utf-8')))
    
    9 và chú thích nó bằng
    import urllib3
    import json
    
    http = urllib3.PoolManager()
    r = http.request('GET', 'https://swapi.dev/api/starships/9/')
    
    print(json.loads(r.data.decode('utf-8')))
    
    0 để chỉ định đường dẫn và tham số REST mong muốn. Lớp cha mẹ của chúng tôi sẽ cung cấp việc thực hiện trong thời gian chạy.
  3. Khởi tạo
    import json
    from urllib import request, parse
    
    data = {"name": "Obi-Wan Kenobi", ...}
    
    encoded_data = json.dumps(data).encode()
    
    req = request.Request('https://httpbin.org/post', data=encoded_data)
    req.add_header('Content-Type', 'application/json')
    response = request.urlopen(req)
    
    text = response.read()
    
    print(json.loads(text.decode('utf-8')))
    
    7 và vượt qua
    import urllib3
    import json
    
    http = urllib3.PoolManager()
    r = http.request('GET', 'https://swapi.dev/api/starships/9/')
    
    print(json.loads(r.data.decode('utf-8')))
    
    2 của chúng tôi.
  4. Gọi phương thức
    import json
    from urllib import request, parse
    
    data = {"name": "Obi-Wan Kenobi", ...}
    
    encoded_data = json.dumps(data).encode()
    
    req = request.Request('https://httpbin.org/post', data=encoded_data)
    req.add_header('Content-Type', 'application/json')
    response = request.urlopen(req)
    
    text = response.read()
    
    print(json.loads(text.decode('utf-8')))
    
    9 của chúng tôi và chuyển ID tàu.
  5. Nhận phản hồi đã sẵn sàng và chỉ cần sử dụng
    import urllib3
    import json
    
    http = urllib3.PoolManager()
    r = http.request('GET', 'https://swapi.dev/api/starships/9/')
    
    print(json.loads(r.data.decode('utf-8')))
    
    4 để chuyển đổi nó thành một đối tượng JSON thích hợp.

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í

import urllib3
import json

http = urllib3.PoolManager()
r = http.request('GET', 'https://swapi.dev/api/starships/9/')

print(json.loads(r.data.decode('utf-8')))
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í
import urllib3
import json

http = urllib3.PoolManager()
r = http.request('GET', 'https://swapi.dev/api/starships/9/')

print(json.loads(r.data.decode('utf-8')))
6 để chỉ ra rằng tham số
import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
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
import urllib3
import json

http = urllib3.PoolManager()
r = http.request('GET', 'https://swapi.dev/api/starships/9/')

print(json.loads(r.data.decode('utf-8')))
5 decorator to indicate a POST request and define the path/route. Additionally, we use a
import urllib3
import json

http = urllib3.PoolManager()
r = http.request('GET', 'https://swapi.dev/api/starships/9/')

print(json.loads(r.data.decode('utf-8')))
6 decorator to indicate that our
import json
import urllib.request

response = urllib.request.urlopen('https://swapi.dev/api/starships/9/')
text = response.read()
print(json.loads(text.decode('utf-8')))
6 parameter should be used as JSON body for the HTTP request.

{
	"name": "Obi-Wan Kenobi",
	"height": "182",
	"mass": "77",
	"hair_color": "auburn, white",
	"skin_color": "fair",
	"eye_color": "blue-gray",
	"birth_year": "57BBY",
	"gender": "male"
}
9

Mộ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ăng

Tấ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.

Thư việnTải xuống hàng thángGitHub ⭐Không đồng bộPhiênHỗ trợ proxySSLHTTP 2Phát hành mới nhất
Aiohttp58m12,4k-2021
Grequests288k4K-2020
Grequests288k4K2022
-Grequests288k--2022
Grequests288k900 ---2022
Grequests288k288k---288k
4KHttpx9m---2022

Grequests

288k

4K

Httpx

9m

8,8k

Yêu cầuCheck it out and the first 1k requests are on us!

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.