Skip to content

第 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 适合什么场景?

🛠️ 动手实践

  1. 启用 HTTP/2 对比 HTTP/1.1 的并发性能。
  2. 实现一个 WebSocket 回声客户端,发送 10 条消息并验证回显。
  3. 创建一个实时数据订阅器,监听 WebSocket 并处理消息。

下一章:中间件与事件钩子