Skip to content

HTTP 请求库:requests & httpx

本章目标:理解 Python HTTP 客户端生态,掌握 requests 与 httpx 的定位差异,安装配置开发环境。

1.1 为什么需要 HTTP 客户端库

Python 标准库提供了 urllib,但它的 API 原始、冗长。生产环境中,开发者几乎都会选择第三方库:

python
# 标准库 urllib — 需要手动处理编码、关闭连接
import urllib.request
req = urllib.request.Request('https://api.github.com/user', headers={'User-Agent': 'python'})
with urllib.request.urlopen(req) as resp:
    data = resp.read().decode('utf-8')

# requests — 一行搞定
import requests
resp = requests.get('https://api.github.com/user')
print(resp.json())

requests 在 2011 年发布后迅速成为 Python HTTP 的事实标准。2020 年后,httpx 作为"现代版 requests"登场,提供原生异步支持HTTP/2

1.2 requests vs httpx 对比

特性requestshttpx
API 风格同步,简洁同步 + 异步双 API
HTTP/2
WebSocket
类型注解✅ (Pydantic)
流式响应支持支持
生态成熟度极成熟快速成长
适用场景脚本、CLI、传统项目现代异步应用、API 客户端

学习路线建议:

  • 先学 requests( API 简单,资料多)
  • 再学 httpx(补充异步能力)
  • 两者 API 高度兼容,切换成本低

1.3 安装与环境配置

bash
# 安装 requests
pip install requests

# 安装 httpx(含 http2 支持需要额外依赖)
pip install httpx
pip install "httpx[http2]"  # 如需 HTTP/2 支持

# 验证安装
python -c "import requests; print(requests.__version__)"
python -c "import httpx; print(httpx.__version__)"

推荐使用 uvpoetry 管理依赖,保持环境隔离。

1.4 第一个请求:GET 一个 API

python
import requests

# 最简单的 GET 请求
resp = requests.get('https://httpbin.org/get')

# 检查状态码
print(resp.status_code)  # 200

# 自动 JSON 解析
data = resp.json()
print(data['headers'])

# 文本响应
print(resp.text[:100])

1.5 本章小结

  • Python HTTP 客户端主要有 requests(同步老牌)和 httpx(现代全功能)两大选择;
  • requests API 简洁,httpx 提供异步和 HTTP/2;
  • 两者 API 相似,掌握其一后学习另一个很快。

🧪 随堂测验

点击你认为正确的选项。答错时会展示正确答案与原因解析。

1. 以下哪个库提供原生异步 HTTP 支持?

2. requests 库的作者是谁?

3. httpx 相比 requests 新增的核心特性不包括?

4. 安装 httpx 并启用 HTTP/2 支持的命令是?

🛠️ 动手实践

  1. 安装 requests 和 httpx,打印两个库的版本号。
  2. 用 requests 访问 https://httpbin.org/get,打印响应状态码和 headers。
  3. 用 httpx 完成同样的请求,对比两者的 API 差异。