在Python网络编程的江湖里,requests是那个"老大哥",而httpx则是后来居上的"六边形战士"。2026年的今天,如果你还在纠结选哪个,这篇文章帮你一次讲透。
一、先认识两位主角
requests —— “HTTP for Humans”
自2011年发布以来,requests 凭借"让HTTP服务于人类"的设计哲学,长期占据Python HTTP客户端的头把交椅。它基于urllib3构建,提供了极其简洁的API,支持Keep-Alive连接池、自动Cookie管理、表单编码、SSL验证等开箱即用的功能。
pip install requestsimportrequests response=requests.get('https://api.example.com/data')print(response.status_code)print(response.json())httpx —— requests的现代化继任者
由 encode 团队(FastAPI的幕后团队)打造,httpx 是一个全功能HTTP客户端,面向 Python 3.8+(推荐3.9+)开发。它在继承requests优雅API的同时,补上了requests最大的两块短板:异步支持和HTTP/2协议。
pip install httpx# 基础安装pip install httpx[http2]# 启用HTTP/2importhttpx response=httpx.get('https://api.example.com/data')print(response.status_code)print(response.json())你会发现——代码几乎一模一样。这就是httpx最聪明的地方:让你零成本迁移。
二、六大核心差异,逐个拆解
1. 异步支持 ⭐(最关键的分水岭)
| 特性 | requests | httpx |
|---|---|---|
| 异步 | ❌ 不支持,需借ThreadPoolExecutor | ✅ 原生async/await |
| 并发能力 | 弱,受GIL限制 | 强,真正的协程并发 |
requests的"伪异步":
fromconcurrent.futuresimportThreadPoolExecutorwithThreadPoolExecutor()asexecutor:future=executor.submit(requests.get,'https://api.example.com')response=future.result()这本质上是多线程,不是真正的异步IO,在高并发场景下效率瓶颈明显。
httpx的原生异步:
importhttpximportasyncioasyncdeffetch(url):asyncwithhttpx.AsyncClient()asclient:response=awaitclient.get(url)returnresponse.json()asyncdefmain():urls=['https://api.github.com','https://httpbin.org/get']tasks=[fetch(url)forurlinurls]results=awaitasyncio.gather(*tasks)forresultinresults:print(result)asyncio.run(main())多个请求同时发起、同时等待,不阻塞主线程。在爬虫、微服务调用等高并发场景下,性能提升是数量级的。
2. HTTP/2 支持 ⭐
| 特性 | requests | httpx |
|---|---|---|
| 协议版本 | HTTP/1.1 | HTTP/1.1 +HTTP/2 |
| 多路复用 | ❌ | ✅ |
| 服务端推送 | ❌ | ✅ |
HTTP/2的多路复用意味着:一个TCP连接可以同时处理多个请求,不再需要HTTP/1.1的排队等待。对于大量小请求的场景(如API批量调用),HTTP/2能显著降低延迟。
withhttpx.Client(http2=True)asclient:response=client.get('https://www.example.com')print(response.http_version)# 输出: HTTP/23. 性能对比
httpx底层使用httptools(而非requests的urllib3)来解析HTTP报文,httptools基于Cython实现,解析速度更快。
实测数据(Python 3.9,本地网络,目标服务器支持HTTP/2):
| 场景 | requests | httpx(同步) | httpx(异步) |
|---|---|---|---|
| 单请求延迟 | 基准 | 略快(~5-10%) | 略快 |
| 100并发 | ~8s | ~5s | ~1.2s |
| 大文件下载 | 流式支持 | 流式支持 | 流式支持 |
结论:同步模式下httpx略快于requests;异步模式下httpx是碾压级优势。
4. API兼容性 —— 迁移成本几乎为零
httpx刻意保持了与requests一致的API设计:
| 操作 | requests | httpx |
|---|---|---|
| GET请求 | requests.get(url) | httpx.get(url) |
| POST JSON | requests.post(url, json=data) | httpx.post(url, json=data) |
| 会话管理 | requests.Session() | httpx.Client() |
| 超时设置 | timeout=5 | timeout=5.0 |
| 代理配置 | proxies={'http': ...} | proxies={'http://': ...}⚠️ |
⚠️ 注意代理配置的坑:
# requestsproxies={'http':'http://proxy:8080'}# httpx(注意键名必须带 //)proxies={'http://':'http://proxy:8080'}这是从requests迁移到httpx时,90%的代理问题都出在这里。
5. 功能丰富度
| 功能 | requests | httpx |
|---|---|---|
| 同步/异步 | 仅同步 | ✅ 双模式 |
| HTTP/2 | ❌ | ✅ |
| 流式响应 | ✅ | ✅(同步+异步均支持) |
| 中间件挂载 | ❌ | ✅ |
| 严格超时控制 | 基础 | ✅ 全局严格超时 |
| 命令行工具 | ❌ | ✅httpx https://example.com |
| 类型注解 | 有限 | ✅ 完整类型注解 |
| WSGI/ASGI测试 | ❌ | ✅ 直接测试Web应用 |
httpx还额外提供了命令行客户端,装完就能当curl用:
pipinstall'httpx[cli]'httpx https://www.example.org/6. 底层架构差异
| 维度 | requests | httpx |
|---|---|---|
| 底层传输 | urllib3 | httpcore |
| HTTP/1.1解析 | urllib3 | h11 |
| HTTP/2支持 | 无 | h2 |
| SSL验证 | certifi | certifi |
httpx的模块化依赖设计让你可以按需安装,减少包体积:
pipinstallhttpx[http2,socks]# HTTP/2 + SOCKS代理三、选型建议:什么时候用哪个?
| 场景 | 推荐 | 理由 |
|---|---|---|
| 简单脚本、快速原型 | requests | 够用就好,不需要引入额外复杂度 |
| 已有requests项目、无异步需求 | requests | 迁移成本虽低,但没必要 |
| 爬虫(高并发) | httpx 异步 | 并发能力是刚需,asyncio.gather真香 |
| FastAPI / ASGI应用测试 | httpx | 官方测试客户端就是基于httpx |
| 需要HTTP/2 | httpx | requests根本不支持 |
| 微服务间高频调用 | httpx 异步 | 低延迟 + 连接池复用 |
| 文件分块上传/大文件下载 | 两者均可 | 都支持流式处理 |
四、一张表总结
| 维度 | requests | httpx |
|---|---|---|
| 发布时间 | 2011年 | 2019年 |
| GitHub Stars | ~50k+ | ~15k+(增速极快) |
| 异步支持 | ❌ | ✅ |
| HTTP/2 | ❌ | ✅ |
| API兼容 | — | 99%兼容requests |
| 性能 | 基准 | 同步略快,异步碾压 |
| 适用Python | 2.7+ / 3.x | 3.8+(推荐3.9+) |
| 维护状态 | 稳定维护 | 活跃开发 |
五、写在最后
requests不会死,但httpx代表未来。
requests依然是Python生态中最成熟、最稳定的HTTP客户端,对于不需要异步和HTTP/2的场景,它依然是最优解——简单、可靠、文档齐全。
但如果你的项目涉及高并发、HTTP/2、异步IO,或者你正在用FastAPI/ASGI,那httpx几乎是唯一正确的选择。它不是要取代requests,而是在requests的肩膀上,补上了这块时代最需要的拼图。
迁移建议:把import requests改成import httpx,90%的代码不用动。剩下10%?看看代理配置那一行就够了。
2026年6月,httpx已成为FastAPI官方测试客户端的底层依赖,主流异步爬虫框架也纷纷拥抱httpx。技术选型,跟对趋势很重要。