在Python网络编程的江湖里,requests 是那个"老大哥",而 httpx 则是后来居上的"六边形战士"。2026年的今天,如果你还在纠结选哪个,这篇文章帮你一次讲透。


一、先认识两位主角

requests —— “HTTP for Humans”

自2011年发布以来,requests 凭借"让HTTP服务于人类"的设计哲学,长期占据Python HTTP客户端的头把交椅。它基于 urllib3 构建,提供了极其简洁的API,支持Keep-Alive连接池、自动Cookie管理、表单编码、SSL验证等开箱即用的功能。

pip install requests
import requests

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/2
import httpx

response = httpx.get('https://api.example.com/data')
print(response.status_code)
print(response.json())

你会发现——代码几乎一模一样。这就是httpx最聪明的地方:让你零成本迁移。


二、六大核心差异,逐个拆解

1. 异步支持 ⭐(最关键的分水岭)

特性 requests httpx
异步 ❌ 不支持,需借ThreadPoolExecutor ✅ 原生async/await
并发能力 弱,受GIL限制 强,真正的协程并发

requests的"伪异步"

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor() as executor:
    future = executor.submit(requests.get, 'https://api.example.com')
    response = future.result()

这本质上是多线程,不是真正的异步IO,在高并发场景下效率瓶颈明显。

httpx的原生异步

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 httpx
协议版本 HTTP/1.1 HTTP/1.1 + HTTP/2
多路复用
服务端推送

HTTP/2的多路复用意味着:一个TCP连接可以同时处理多个请求,不再需要HTTP/1.1的排队等待。对于大量小请求的场景(如API批量调用),HTTP/2能显著降低延迟。

with httpx.Client(http2=True) as client:
    response = client.get('https://www.example.com')
    print(response.http_version)  # 输出: HTTP/2

3. 性能对比

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://': ...} ⚠️

⚠️ 注意代理配置的坑

# requests
proxies = {'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用:

pip install 'httpx[cli]'
httpx https://www.example.org/

6. 底层架构差异

维度 requests httpx
底层传输 urllib3 httpcore
HTTP/1.1解析 urllib3 h11
HTTP/2支持 h2
SSL验证 certifi certifi

httpx的模块化依赖设计让你可以按需安装,减少包体积:

pip install httpx[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。技术选型,跟对趋势很重要。

更多推荐