HTTP/2
HTTP/2 是 HTTP 协议的一次重大迭代,它提供了更高效的传输方式,具有潜在的性能优势。HTTP/2 不会改变请求或响应的核心语义,但改变了数据与服务器之间的传输方式。
与 HTTP/1.1 使用的文本格式不同,HTTP/2 采用二进制格式。这种二进制格式实现了完整的请求和响应多路复用,以及 HTTP 头部的高效压缩。流多路复用意味着,在 HTTP/1.1 中每个并发请求需要一个 TCP 流,而 HTTP/2 允许单个 TCP 流处理多个并发请求。
HTTP/2 还支持响应优先级排序和服务器推送等功能。
如需全面了解 HTTP/2,您可以查阅《HTTP/2 详解》。
启用 HTTP/2
使用 httpx
客户端时,默认不启用 HTTP/2 支持,因为 HTTP/1.1 是一个成熟且经过实战检验的传输层,目前我们的 HTTP/1.1 实现可能被认为是更稳健的选择。未来版本的 httpx
可能会默认启用 HTTP/2 支持。
如果您需要发出高度并发的请求,可以考虑尝试我们的 HTTP/2 支持。首先确保安装可选的 HTTP/2 依赖项:
$ pip install httpx[http2]
然后实例化一个启用 HTTP/2 支持的客户端:
client = httpx.AsyncClient(http2=True)
...
您还可以将客户端实例化为上下文管理器,以确保所有 HTTP 连接都在明确的范围内,并在退出上下文块时关闭。
async with httpx.AsyncClient(http2=True) as client:
...
HTTP/2 支持在 Client
和 AsyncClient
上都可用,但如果您需要发出大量并发请求,通常在异步上下文中更为实用。
检查 HTTP 版本
在客户端启用 HTTP/2 支持并不必然意味着你的请求和响应会通过 HTTP/2 传输,因为客户端和服务器都需要支持 HTTP/2。如果你连接到一个仅支持 HTTP/1.1 的服务器,客户端将转而使用标准的 HTTP/1.1 连接。
你可以通过检查响应中的 .http_version
属性来确定实际使用的 HTTP 协议版本。
client = httpx.AsyncClient(http2=True)
response = await client.get(...)
print(response.http_version) # 可能输出 "HTTP/1.0"、"HTTP/1.1" 或 "HTTP/2"