第 13 章 · HTTP/2 与 WebSocket
本章目标:理解 HTTP/2 多路复用优势,掌握 httpx 的 HTTP/2 和 WebSocket 支持。
13.1 HTTP/2 多路复用
HTTP/1.1 存在队头阻塞问题——一个慢请求阻塞后续所有请求。HTTP/2 通过多路复用解决:
bash
pip install "httpx[http2]"python
import httpx
# 启用 HTTP/2
client = httpx.Client(h2=True)
resp = client.get('https://httpbin.org/get')
# 多路复用:多个请求共享一个 TCP 连接
with httpx.Client(h2=True) as client:
resp1 = client.get('https://api.github.com/users/octocat')
resp2 = client.get('https://api.github.com/users/torvalds')
# 两个请求在同一个连接上并发传输,互不阻塞13.2 WebSocket 支持
httpx 内置 WebSocket 客户端:
python
import httpx
import asyncio
async def websocket_demo():
uri = "wss://echo.websocket.org"
async with httpx.AsyncClient() as client:
async with client.websocket_connect(uri) as ws:
await ws.send_text("Hello, WebSocket!")
response = await ws.receive_text()
print(f"收到: {response}") # 回显 "Hello, WebSocket!"
asyncio.run(websocket_demo())13.3 实际应用场景
python
import httpx
import asyncio
class RealtimeMonitor:
"""实时监控 WebSocket 数据"""
def __init__(self, url: str):
self.url = url
self.client = httpx.AsyncClient()
async def connect(self):
self.ws = await self.client.websocket_connect(self.url)
await self.ws.send_text('subscribe: market_data')
async def listen(self):
async for message in self.ws.iter_text():
print(f"收到: {message}")
# 处理实时数据...
async def close(self):
await self.ws.close()
await self.client.aclose()13.4 本章小结
- HTTP/2 多路复用提升并发性能,减少连接数;
- httpx 原生支持 WebSocket,无需额外库;
- HTTP/2 需要额外安装:
pip install "httpx[http2]"。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. HTTP/2 相比 HTTP/1.1 的核心优势是?
2. httpx 启用 HTTP/2 需要什么?
3. httpx 的 WebSocket 客户端属于哪一层?
4. WebSocket 适合什么场景?
🛠️ 动手实践
- 启用 HTTP/2 对比 HTTP/1.1 的并发性能。
- 实现一个 WebSocket 回声客户端,发送 10 条消息并验证回显。
- 创建一个实时数据订阅器,监听 WebSocket 并处理消息。