第 10 章 · httpx 简介与同步 API
本章目标:理解 httpx 的设计哲学,掌握同步客户端的基本用法,对比 requests 的异同。
10.1 为什么选择 httpx
requests 是同步 HTTP 库的事实标准,但它有一个根本局限:不支持异步。随着 asyncio 在 Python 生态中的普及,httpx 应运而生:
python
# requests — 只能同步
import requests
resp = requests.get('https://api.github.com') # 阻塞整个线程
# httpx — 同步和异步共用同一套 API
import httpx
# 同步用法(与 requests 几乎相同)
resp = httpx.get('https://api.github.com')
# 异步用法
async resp = await httpx.AsyncClient().get('https://api.github.com')10.2 安装与基础用法
bash
pip install httpxpython
import httpx
# 最简单的 GET 请求
resp = httpx.get('https://httpbin.org/get')
print(resp.status_code) # 200
print(resp.json()) # 自动解析 JSON
# POST 请求
resp = httpx.post(
'https://httpbin.org/post',
json={'key': 'value'}
)10.3 与 requests API 对比
| 操作 | requests | httpx |
|---|---|---|
| GET | requests.get(url) | httpx.get(url) |
| POST JSON | requests.post(url, json=data) | httpx.post(url, json=data) |
| 查询参数 | requests.get(url, params={}) | httpx.get(url, params={}) |
| 请求头 | headers={'Key': 'Val'} | headers={'Key': 'Val'} |
| 超时 | timeout=10 | timeout=10.0 |
| Session | requests.Session() | httpx.Client() |
关键差异
httpx 的 timeout 只接受浮点数(秒),requests 可接受整数或元组 (connect, read)。
10.4 Client 对象与连接池
python
import httpx
# 创建持久化客户端(复用连接池)
with httpx.Client() as client:
# 所有请求共享连接池
resp1 = client.get('https://api.github.com/users/octocat')
resp2 = client.get('https://api.github.com/users/torvalds')
# 检查连接复用
print(client.transport) # HTTPConnectionPool 实例10.5 本章小结
- httpx 提供同步和异步双 API,API 风格与 requests 高度兼容;
- 使用
httpx.Client()管理连接池,替代 requests 的 Session; - 学习 httpx 对熟悉 requests 的开发者几乎零成本。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. httpx 与 requests 的核心区别是?
2. httpx.Client() 与 requests.Session() 的关系是?
3. httpx.get() 的 timeout 参数类型是?
4. 从 requests 迁移到 httpx 的主要工作是什么?
🛠️ 动手实践
- 用 httpx 同步 API 实现与 requests 相同的 GitHub 用户查询。
- 对比 httpx.Client() 和新建多个 httpx.get() 的连接复用情况。
- 实现一个函数,同时用 requests 和 httpx 发送相同请求,比较耗时。