提示
如果您是來自Requests的用戶,則可以使用 ?httpx.Client()
?代替?requests.Session()
?。
總結(jié):
如果您做的不僅僅是實驗、一次性腳本或原型,那么您應該使用?Client
?實例。
使用快速入門指南中所述的頂級 API 發(fā)出請求時,HTTPX 必須為每個請求建立新連接(不會重用連接)。隨著對主機的請求數(shù)量的增加,這很快就會變得低效。
另一方面,?Client
?實例使用 HTTP 連接池。這意味著,當您向同一主機發(fā)出多個請求時,?Client
?將重用底層 TCP 連接,而不是為每個請求重新創(chuàng)建一個連接。
與使用頂級 API 相比,這可以帶來顯著的性能改進,包括:
Client實例還支持頂級 API 中不可用的功能,例如:
本章節(jié)的其他部分將更詳細地介紹您可以對Client實例執(zhí)行的操作。
推薦使用?Client
?的方法是作為上下文管理器。這將確保在離開?with
?塊時正確清理連接:
with httpx.Client() as client:
...
或者,您可以使用.close()明確關(guān)閉連接池而不使用with塊:
client = httpx.Client()
try:
...
finally:
client.close()
一旦你有了 ?Client
?,你可以使用?.get()
?、?.post()
? 等發(fā)送請求。例如:
>>> with httpx.Client() as client:
... r = client.get('https://example.com')
...
>>> r
<Response [200 OK]>
這些方法接受與?httpx.get()
?、?httpx.post()
? 等相同的參數(shù)。這意味著快速入門指南中記錄的所有功能在?Client
?級別也可用。
例如,要發(fā)送帶有自定義標頭的請求,請執(zhí)行以下操作:
>>> with httpx.Client() as client:
... headers = {'X-Custom': 'value'}
... r = client.get('https://example.com', headers=headers)
...
>>> r.request.headers['X-Custom']
'value'
?Clients
?允許您通過將參數(shù)傳遞給?Client
?構(gòu)造函數(shù),將配置應用于所有傳出請求。
例如,要對每個請求應用一組自定義標頭,請執(zhí)行以下操作:
>>> url = 'http://httpbin.org/headers'
>>> headers = {'user-agent': 'my-app/0.0.1'}
>>> with httpx.Client(headers=headers) as client:
... r = client.get(url)
...
>>> r.json()['headers']['User-Agent']
'my-app/0.0.1'
在client-level和request-level同時提供配置選項時,可能會發(fā)生以下兩種情況之一:
>>> headers = {'X-Auth': 'from-client'}
>>> params = {'client_id': 'client1'}
>>> with httpx.Client(headers=headers, params=params) as client:
... headers = {'X-Custom': 'from-request'}
... params = {'request_id': 'request1'}
... r = client.get('https://example.com', headers=headers, params=params)
...
>>> r.request.url
URL('https://example.com?client_id=client1&request_id=request1')
>>> r.request.headers['X-Auth']
'from-client'
>>> r.request.headers['X-Custom']
'from-request'
>>> with httpx.Client(auth=('tom', 'mot123')) as client:
... r = client.get('https://example.com', auth=('alice', 'ecila123'))
...
>>> _, _, auth = r.request.headers['Authorization'].partition(' ')
>>> import base64
>>> base64.b64decode(auth)
b'alice:ecila123'
如果您需要對client級和request級參數(shù)的合并進行更精細的控制,請參閱請求實例。
此外,Client接受一些在請求級別不可用的配置選項。
例如,?base_url
?允許您為所有傳出請求預先添加URL:
>>> with httpx.Client(base_url='http://httpbin.org') as client:
... r = client.get('/headers')
...
>>> r.request.url
URL('http://httpbin.org/headers')
有關(guān)所有可用Client參數(shù)的列表,請參閱Client API 參考。
更多建議: