查看: 110|回复: 3

Python HTTP客户端选型:requests与httpx异步支持、HTTP/2及迁移实战

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在Python网络编程领域,requests自2011年发布以来,凭借简洁API和稳定表现成为最流行的HTTP客户端。但2019年诞生的httpx,凭借异步支持和HTTP/2能力,正成为越来越多开发者的新选择。本文将从六大核心差异出发,帮你做出选型决策。

一、两个库的定位

requests,设计哲学“HTTP for Humans”,基于urllib3构建,提供开箱即用的Keep-Alive连接池、自动Cookie管理、SSL验证等功能。安装与使用极简:
  1. pip install requests
  2. import requests
  3. response = requests.get('https://api.example.com/data')
  4. print(response.status_code, response.json())
复制代码

httpx由FastAPI幕后团队encode打造,面向Python 3.8+(推荐3.9+),在继承requests优雅API的同时,原生支持异步和HTTP/2。基础安装与使用:
  1. pip install httpx
  2. # 如需HTTP/2,安装:pip install httpx[http2]
  3. import httpx
  4. response = httpx.get('https://api.example.com/data')
  5. print(response.status_code, response.json())
复制代码
代码几乎一模一样,迁移成本极低。

二、六大核心差异

1. 异步支持(最关键分水岭)
requests不支持原生异步,只能通过多线程模拟,受GIL限制,高并发下效率低:
  1. from concurrent.futures import ThreadPoolExecutor
  2. with ThreadPoolExecutor() as executor:
  3.     future = executor.submit(requests.get, 'https://api.example.com')
  4.     response = future.result()
复制代码
httpx原生支持async/await,利用协程实现真正的并发:
  1. import httpx
  2. import asyncio
  3. async def fetch(url):
  4.     async with httpx.AsyncClient() as client:
  5.         response = await client.get(url)
  6.         return response.json()
  7. async def main():
  8.     urls = ['https://api.github.com', 'https://httpbin.org/get']
  9.     tasks = [fetch(url) for url in urls]
  10.     results = await asyncio.gather(*tasks)
  11.     for result in results:
  12.         print(result)
  13. asyncio.run(main())
复制代码
多个请求并行等待,不阻塞主线程,在爬虫、微服务调用中性能提升数量级。

2. HTTP/2支持
requests仅支持HTTP/1.1,httpx同时支持HTTP/1.1和HTTP/2,包括多路复用和服务端推送。启用HTTP/2:
  1. with httpx.Client(http2=True) as client:
  2.     response = client.get('https://www.example.com')
  3.     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,迁移几乎零成本:
  1. # requests
  2. requests.get(url)
  3. requests.post(url, json=data)
  4. requests.Session()
  5. timeout=5
  6. proxies={'http': 'http://proxy:8080'}
  7. # httpx 对应写法
  8. httpx.get(url)
  9. httpx.post(url, json=data)
  10. httpx.Client()
  11. timeout=5.0
  12. proxies={'http://': 'http://proxy:8080'}  # 注意键名必须带 //
复制代码
特别注意代理配置:requests用'http',httpx要用'http://',这是90%的迁移问题根源。

5. 功能丰富度
httpx额外支持:中间件挂载、严格超时控制、命令行客户端(可当curl用)、完整的类型注解、直接测试WSGI/ASGI应用。安装命令行工具:
  1. pip install 'httpx[cli]'
  2. httpx https://www.example.org/
复制代码

6. 底层架构
requests传输层基于urllib3,HTTP/1.1解析用urllib3;httpx传输层基于httpcore,HTTP/1.1解析用h11,HTTP/2用h2,SSL验证用certifi。模块化设计允许按需安装减少体积:
  1. 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官方测试客户端底层依赖,主流异步爬虫框架纷纷拥抱它。技术选型,跟对趋势很重要。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python HTTP客户端选型:requests与httpx异步支持、HTTP/2及迁移实战

感谢分享!非常详实的对比,特别是关于代理配置键名差异的提醒,之前迁移时确实踩过这个坑。想请教一下,楼主在实际项目中,如果使用httpx异步客户端,对于连接超时和重试策略,有没有推荐的配置方式?是否比requests的适配器配置更简便?
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python HTTP客户端选型:requests与httpx异步支持、HTTP/2及迁移实战

写得非常详细,正好最近也在纠结这两个库的选择。你提到的代理配置键名差异我确实踩过坑,后来在文档里翻到才解决。异步性能对比的数据很直观,爬虫场景下httpx的优势确实明显。不过想请教一下,你在实际迁移大型项目时,大概需要改动多少代码?有没有什么隐藏的兼容性问题(比如自定义适配器或者钩子函数)?
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python HTTP客户端选型:requests与httpx异步支持、HTTP/2及迁移实战

写得非常全面,把两个库的定位、差异和迁移细节都梳理清楚了。我平时用requests多一些,但最近在写异步爬虫时开始尝试httpx,确实感受到了异步带来的效率提升。代理配置那个坑我踩过,键名加“
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-23 12:04 , Processed in 0.050491 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部