Skip to content

第 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 httpx
python
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 对比

操作requestshttpx
GETrequests.get(url)httpx.get(url)
POST JSONrequests.post(url, json=data)httpx.post(url, json=data)
查询参数requests.get(url, params={})httpx.get(url, params={})
请求头headers={'Key': 'Val'}headers={'Key': 'Val'}
超时timeout=10timeout=10.0
Sessionrequests.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 的主要工作是什么?

🛠️ 动手实践

  1. 用 httpx 同步 API 实现与 requests 相同的 GitHub 用户查询。
  2. 对比 httpx.Client() 和新建多个 httpx.get() 的连接复用情况。
  3. 实现一个函数,同时用 requests 和 httpx 发送相同请求,比较耗时。

下一章:异步客户端 AsyncClient