HTTPX:Python HTTP 客户端的下一代选择

httpx 在 GitHub 上已经拿到 15,279 Star 了。

encode 团队出品的这个库,目标是取代 requests 成为 Python 生态里默认的 HTTP 客户端。它做到了跟 requests API 兼容的同时,内置了对 HTTP/2、异步请求和命令行工具的支持。

1、 它跟 requests 区别在哪

正文顶部截图

requests 是 Python 世界里用得最广的 HTTP 库,但它有两个短板:不支持 HTTP/2,不支持原生 async/await。HTTP/2 的多路复用对高并发场景是刚需,而异步编程已经是 Python Web 开发的主流范式。这两个短板在实际项目中越来越绕不开。

HTTPX 把这两个问题都填上了。API 设计跟 requests 高度接近,迁移成本低。底层从 urllib3 换成了自研的 httpcore,用 h11 和 h2 分别处理 HTTP/1.1 和 HTTP/2。

2、 核心能力

README区域截图

同步和异步两套接口,同一个 Session 对象同时支持 withasync with。请求超时默认开启,不会出现忘记设 timeout 导致请求永久挂起的情况。

命令行客户端是另一个亮点。pip install httpx[cli] 之后用 httpx http://example.org 就能直接发请求,调试接口时不用切到 Postman 或 curl。

测试场景下可以直接向 WSGI 或 ASGI 应用发请求,不需要启动服务器。对 FastAPI、Django、Flask 的集成测试来说,这个能力省掉了一大段脚手架代码。

代码覆盖率 100%,全部类型标注。

3、 安装和起步

$ pip install httpx

需要 HTTP/2 支持:

$ pip install httpx[http2]

基本用法跟 requests 一样,不用学新东西:

import httpx
r = httpx.get('https://www.example.org/')
r.status_code
r.json()

异步用法也简单:

async with httpx.AsyncClient() as client:
    r = await client.get('https://www.example.org/')

Python 3.9 以上都能用。

4、 适合谁

  • 已经在用 requests 但想升级到 HTTP/2 或异步的团队

  • 用 FastAPI 做微服务、需要在测试里请求自己应用的开发者

  • 写爬虫或 API 网关、对连接池和超时控制有要求的场景

  • 需要命令行 HTTP 工具、不想记 curl 参数的人

  • 写爬虫或 API 网关、对连接池和超时控制有要求的场景

  • 需要命令行 HTTP 工具、不想记 curl 参数的人

更多推荐