提示
如果您是來自Requests的用戶,則可以使用 ?httpx.Client()
?代替?requests.Session()
?。
總結(jié):
如果您做的不僅僅是實(shí)驗(yàn)、一次性腳本或原型,那么您應(yīng)該使用?Client
?實(shí)例。
使用快速入門指南中所述的頂級(jí) API 發(fā)出請(qǐng)求時(shí),HTTPX 必須為每個(gè)請(qǐng)求建立新連接(不會(huì)重用連接)。隨著對(duì)主機(jī)的請(qǐng)求數(shù)量的增加,這很快就會(huì)變得低效。
另一方面,?Client
?實(shí)例使用 HTTP 連接池。這意味著,當(dāng)您向同一主機(jī)發(fā)出多個(gè)請(qǐng)求時(shí),?Client
?將重用底層 TCP 連接,而不是為每個(gè)請(qǐng)求重新創(chuàng)建一個(gè)連接。
與使用頂級(jí) API 相比,這可以帶來顯著的性能改進(jìn),包括:
Client實(shí)例還支持頂級(jí) API 中不可用的功能,例如:
本章節(jié)的其他部分將更詳細(xì)地介紹您可以對(duì)Client實(shí)例執(zhí)行的操作。
推薦使用?Client
?的方法是作為上下文管理器。這將確保在離開?with
?塊時(shí)正確清理連接:
with httpx.Client() as client:
...
或者,您可以使用.close()明確關(guān)閉連接池而不使用with塊:
client = httpx.Client()
try:
...
finally:
client.close()
一旦你有了 ?Client
?,你可以使用?.get()
?、?.post()
? 等發(fā)送請(qǐng)求。例如:
>>> with httpx.Client() as client:
... r = client.get('https://example.com')
...
>>> r
<Response [200 OK]>
這些方法接受與?httpx.get()
?、?httpx.post()
? 等相同的參數(shù)。這意味著快速入門指南中記錄的所有功能在?Client
?級(jí)別也可用。
例如,要發(fā)送帶有自定義標(biāo)頭的請(qǐng)求,請(qǐng)執(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ù),將配置應(yīng)用于所有傳出請(qǐng)求。
例如,要對(duì)每個(gè)請(qǐng)求應(yīng)用一組自定義標(biāo)頭,請(qǐng)執(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同時(shí)提供配置選項(xiàng)時(shí),可能會(huì)發(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'
如果您需要對(duì)client級(jí)和request級(jí)參數(shù)的合并進(jìn)行更精細(xì)的控制,請(qǐng)參閱請(qǐng)求實(shí)例。
此外,Client接受一些在請(qǐng)求級(jí)別不可用的配置選項(xiàng)。
例如,?base_url
?允許您為所有傳出請(qǐng)求預(yù)先添加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ù)的列表,請(qǐng)參閱Client API 參考。
更多建議: