httpx Client實(shí)例

2022-07-26 09:55 更新
提示
如果您是來自Requests的用戶,則可以使用 ?httpx.Client()?代替?requests.Session()?。

為什么要使用Client?

總結(jié):
如果您做的不僅僅是實(shí)驗(yàn)、一次性腳本或原型,那么您應(yīng)該使用?Client?實(shí)例。

更高效地利用網(wǎng)絡(luò)資源

使用快速入門指南中所述的頂級(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),包括:

  • 減少跨請(qǐng)求的延遲(無握手)。
  • 降低了 CPU 使用率和往返行程。
  • 減少網(wǎng)絡(luò)擁塞。

額外功能

Client實(shí)例還支持頂級(jí) API 中不可用的功能,例如:

  • 跨請(qǐng)求的 Cookie 持久性。
  • 對(duì)所有傳出請(qǐng)求應(yīng)用配置。
  • 通過 HTTP 代理發(fā)送請(qǐng)求。
  • 使用 HTTP/2。

本章節(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()

構(gòu)造請(qǐng)求

一旦你有了 ?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'

跨請(qǐng)求共享配置

?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ā)生以下兩種情況之一:

  • 對(duì)于標(biāo)頭、查詢參數(shù)和 Cookie,這些值將組合在一起。例如:
    >>> 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'
  • 對(duì)于所有其他參數(shù),request級(jí)值優(yōu)先。例如:
    >>> 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專用配置選項(xiàng)

此外,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 參考。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)