httpx Client實例

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

為什么要使用Client?

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

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

使用快速入門指南中所述的頂級 API 發(fā)出請求時,HTTPX 必須為每個請求建立新連接(不會重用連接)。隨著對主機的請求數(shù)量的增加,這很快就會變得低效。

另一方面,?Client?實例使用 HTTP 連接池。這意味著,當您向同一主機發(fā)出多個請求時,?Client?將重用底層 TCP 連接,而不是為每個請求重新創(chuàng)建一個連接。

與使用頂級 API 相比,這可以帶來顯著的性能改進,包括:

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

額外功能

Client實例還支持頂級 API 中不可用的功能,例如:

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

本章節(jié)的其他部分將更詳細地介紹您可以對Client實例執(zhí)行的操作。

用法

推薦使用?Client?的方法是作為上下文管理器。這將確保在離開?with?塊時正確清理連接:

with httpx.Client() as client:
    ...

或者,您可以使用.close()明確關(guān)閉連接池而不使用with塊:

client = httpx.Client()
try:
    ...
finally:
    client.close()

構(gòu)造請求

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

  • 對于標頭、查詢參數(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'
  • 對于所有其他參數(shù),request級值優(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'

如果您需要對client級和request級參數(shù)的合并進行更精細的控制,請參閱請求實例。

其他Client專用配置選項

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號