在Python网络编程领域,requests自2011年发布以来,凭借简洁API和稳定表现成为最流行的HTTP客户端。但2019年诞生的httpx,凭借异步支持和HTTP/2能力,正成为越来越多开发者的新选择。本文将从六大核心差异出发,帮你做出选型决策。
一、两个库的定位
requests,设计哲学“HTTP for Humans”,基于urllib3构建,提供开箱即用的Keep-Alive连接池、自动Cookie管理、SSL验证等功能。安装与使用极简:- pip install requests
- import requests
- response = requests.get('https://api.example.com/data')
- print(response.status_code, response.json())
复制代码
httpx由FastAPI幕后团队encode打造,面向Python 3.8+(推荐3.9+),在继承requests优雅API的同时,原生支持异步和HTTP/2。基础安装与使用:- pip install httpx
- # 如需HTTP/2,安装:pip install httpx[http2]
- import httpx
- response = httpx.get('https://api.example.com/data')
- print(response.status_code, response.json())
复制代码 代码几乎一模一样,迁移成本极低。
二、六大核心差异
1. 异步支持(最关键分水岭)
requests不支持原生异步,只能通过多线程模拟,受GIL限制,高并发下效率低:- from concurrent.futures import ThreadPoolExecutor
- with ThreadPoolExecutor() as executor:
- future = executor.submit(requests.get, 'https://api.example.com')
- response = future.result()
复制代码 httpx原生支持async/await,利用协程实现真正的并发:- import httpx
- import asyncio
- async def fetch(url):
- async with httpx.AsyncClient() as client:
- response = await client.get(url)
- return response.json()
- async def main():
- urls = ['https://api.github.com', 'https://httpbin.org/get']
- tasks = [fetch(url) for url in urls]
- results = await asyncio.gather(*tasks)
- for result in results:
- print(result)
- asyncio.run(main())
复制代码 多个请求并行等待,不阻塞主线程,在爬虫、微服务调用中性能提升数量级。
2. HTTP/2支持
requests仅支持HTTP/1.1,httpx同时支持HTTP/1.1和HTTP/2,包括多路复用和服务端推送。启用HTTP/2:- with httpx.Client(http2=True) as client:
- response = client.get('https://www.example.com')
- print(response.http_version) # 输出: HTTP/2
复制代码 多路复用允许一个TCP连接同时处理多个请求,大量小请求场景下显著降低延迟。
3. 性能对比
httpx底层使用基于Cython的httptools解析HTTP报文,比requests的urllib3更快。实测数据(Python 3.9,本地网络,目标支持HTTP/2):
- 单请求延迟:httpx同步略快(约5-10%);
- 100并发:requests约8s,httpx同步约5s,httpx异步约1.2s;
- 大文件下载均支持流式。
结论:同步模式httpx略优,异步模式优势巨大。
4. API兼容性
httpx刻意保持与requests一致的API,迁移几乎零成本:- # requests
- requests.get(url)
- requests.post(url, json=data)
- requests.Session()
- timeout=5
- proxies={'http': 'http://proxy:8080'}
- # httpx 对应写法
- httpx.get(url)
- httpx.post(url, json=data)
- httpx.Client()
- timeout=5.0
- proxies={'http://': 'http://proxy:8080'} # 注意键名必须带 //
复制代码 特别注意代理配置:requests用'http',httpx要用'http://',这是90%的迁移问题根源。
5. 功能丰富度
httpx额外支持:中间件挂载、严格超时控制、命令行客户端(可当curl用)、完整的类型注解、直接测试WSGI/ASGI应用。安装命令行工具:- pip install 'httpx[cli]'
- httpx https://www.example.org/
复制代码
6. 底层架构
requests传输层基于urllib3,HTTP/1.1解析用urllib3;httpx传输层基于httpcore,HTTP/1.1解析用h11,HTTP/2用h2,SSL验证用certifi。模块化设计允许按需安装减少体积:- pip install httpx[http2,socks] # 包含HTTP/2和SOCKS代理
复制代码
三、选型建议
- 简单脚本、快速原型:requests够用,无需引入额外复杂度。
- 已有requests项目、无异步需求:保持原样,迁移成本低但没必要。
- 爬虫(高并发):httpx异步,asyncio.gather是刚需。
- FastAPI/ASGI应用测试:httpx官方测试客户端基于自身。
- 需要HTTP/2:httpx是唯一选择。
- 微服务高频调用:httpx异步低延迟+连接池复用。
- 大文件上传下载:两者均可,均支持流式。
四、总结
requests不会消亡,它依然是最成熟、最稳定的HTTP客户端,适用于不需要异步和HTTP/2的场景。httpx代表未来,在高并发、HTTP/2、异步IO需求下是最优解。迁移十分简单:将import requests改为import httpx,90%代码不需改动;剩下10%大多是代理配置的键名差异。截至2026年,httpx已成为FastAPI官方测试客户端底层依赖,主流异步爬虫框架纷纷拥抱它。技术选型,跟对趋势很重要。 |