httpx==0.28.1和aiohttp==3.13.1这两个Python主流HTTP库的核心功能、使用方法,以及各自的适用场景,我会从核心定位+功能亮点+基础使用+进阶用法+核心区别几个维度讲清楚,兼顾新手易上手和实际开发常用场景,两个库的用法都会提供可直接运行的代码示例。
一、httpx==0.28.1 详解
核心定位
httpx是Python新一代HTTP客户端库,同时支持同步和异步请求 ,是requests库的完美替代(API和requests高度兼容,上手无成本),还解决了requests不支持异步、对HTTP/2支持不佳的问题,0.28.1是稳定版,兼容Python3.8+。
核心功能亮点
- 同步/异步API双支持,切换仅需修改少量代码;
- 完全兼容requests的API,学过requests就能直接用;
- 支持HTTP/1.1和HTTP/2,支持HTTPS、代理、Cookie、会话保持;
- 内置连接池,性能优于原生requests;
- 支持流式请求/响应、文件上传下载,支持自定义请求头/超时。
安装
bash
pip install httpx==0.28.1
基础使用方法
1. 同步请求(最常用,替代requests)
和requests的用法几乎一致,零学习成本,常用的get/post/put/delete都支持。
python
import httpx
# 1. 简单GET请求(带参数、请求头)
params = {"page": 1, "size": 10}
headers = {"User-Agent": "httpx-test/0.28.1"}
# 发送请求,timeout设置超时时间(避免无限等待)
response = httpx.get(
url="https://httpbin.org/get",
params=params,
headers=headers,
timeout=10
)
# 响应结果处理(核心属性)
print("状态码:", response.status_code) # 200
print("响应头:", response.headers)
print("文本响应:", response.text) # 字符串格式
print("JSON响应:", response.json()) # 解析JSON(自动处理)
print("二进制响应:", response.content) # 字节格式(下载图片/文件用)
# 2. 简单POST请求(表单格式/JSON格式)
# 2.1 表单格式(application/x-www-form-urlencoded)
form_data = {"username": "test", "password": "123456"}
r1 = httpx.post("https://httpbin.org/post", data=form_data, timeout=10)
# 2.2 JSON格式(application/json,最常用)
json_data = {"name": "httpx", "version": "0.28.1"}
r2 = httpx.post("https://httpbin.org/post", json=json_data, timeout=10)
# 3. 会话保持(复用连接,处理Cookie/会话)
with httpx.Client() as client:
# 所有通过client发送的请求都会复用连接、共享Cookie
client.get("https://httpbin.org/cookies/set?name=test")
res = client.get("https://httpbin.org/cookies")
print("会话Cookie:", res.json())
2. 异步请求(httpx核心亮点,单线程高并发)
异步用法需要配合Python的async/await语法,适合高并发场景 (如爬虫、接口测试、微服务调用),核心用AsyncClient。
python
import asyncio
import httpx
async def async_request_demo():
# 异步会话(推荐用with语句,自动管理连接)
async with httpx.AsyncClient(timeout=10) as client:
# 1. 异步GET请求
res1 = await client.get(
"https://httpbin.org/get",
params={"async": "true"},
headers={"User-Agent": "httpx-async/0.28.1"}
)
# 2. 异步POST JSON请求
res2 = await client.post(
"https://httpbin.org/post",
json={"type": "async"}
)
# 3. 并发请求(核心优势,同时发送多个请求)
task1 = client.get("https://httpbin.org/delay/1") # 模拟1秒延迟
task2 = client.get("https://httpbin.org/delay/1")
task3 = client.get("https://httpbin.org/delay/1")
# gather同时执行多个异步任务,总耗时≈1秒(而非串行3秒)
results = await asyncio.gather(task1, task2, task3)
print("并发请求数量:", len(results))
# 运行异步函数(Python3.7+简化写法)
if __name__ == "__main__":
asyncio.run(async_request_demo())
3. 进阶用法(常用)
-
HTTP/2支持 :创建客户端时指定
http2=True即可,无需修改其他代码;pythonwith httpx.Client(http2=True) as client: res = client.get("https://www.baidu.com") print("HTTP版本:", res.http_version) # HTTP/2 -
代理设置 :支持http/https/socks代理;
pythonproxies = { "http://": "http://127.0.0.1:8080", "https://": "http://127.0.0.1:8080" } httpx.get("https://httpbin.org/get", proxies=proxies) -
文件上传 :直接传
files参数,和requests一致;pythonfiles = {"file": open("test.txt", "rb")} httpx.post("https://httpbin.org/post", files=files)
二、aiohttp==3.13.1 详解
核心定位
aiohttp是Python纯异步 的HTTP客户端+服务端库,3.13.1是最新稳定版(2025年发布),仅支持Python3.8+,专注于异步高并发场景 ,不提供同步API,是Python异步生态中最成熟、性能最优的HTTP客户端库之一,常和asyncio、aiomysql等异步库配合使用。
核心功能亮点
- 纯异步实现,高并发性能优于httpx的异步模式(专注异步,做了更多底层优化);
- 同时支持客户端(Client)和服务端(Server)(httpx主要是客户端,服务端功能较弱);
- 支持HTTP/1.1、HTTPS、代理、Cookie、会话保持、连接池;
- 支持流式请求/响应、大文件上传下载(对异步流式处理支持更友好);
- 支持WebSocket异步通信(实时通信场景,如聊天、推送);
- 轻量可扩展,适合构建异步微服务、高并发爬虫。
安装
bash
pip install aiohttp==3.13.1
# 可选:安装chardet(编码检测)、aiosignal(信号管理),aiohttp依赖会自动装
基础使用方法
aiohttp只有异步API ,必须配合async/await,核心客户端类是aiohttp.ClientSession(替代httpx的AsyncClient)。
1. 基础异步请求(GET/POST)
python
import asyncio
import aiohttp
async def aiohttp_base_demo():
# 核心:ClientSession(异步会话,复用连接,推荐with语句)
async with aiohttp.ClientSession() as session:
# 1. 异步GET请求(params/headers/timeout)
# timeout用aiohttp.ClientTimeout,单位秒
timeout = aiohttp.ClientTimeout(total=10)
async with session.get(
url="https://httpbin.org/get",
params={"page": 1, "size": 10},
headers={"User-Agent": "aiohttp-test/3.13.1"},
timeout=timeout
) as response:
# 响应处理(和httpx略有不同,需await解析)
print("状态码:", response.status) # 注意:是status,不是status_code
print("响应头:", response.headers)
print("文本响应:", await response.text()) # 解析文本需await
print("JSON响应:", await response.json()) # 解析JSON需await
print("二进制响应:", await response.read()) # 字节格式,需await
# 2. 异步POST请求(表单/JSON)
# 2.1 JSON格式(application/json,最常用)
json_data = {"name": "aiohttp", "version": "3.13.1"}
async with session.post(
"https://httpbin.org/post",
json=json_data,
timeout=timeout
) as res2:
print(await res2.json())
# 2.2 表单格式(application/x-www-form-urlencoded)
form_data = aiohttp.FormData()
form_data.add_field("username", "test")
form_data.add_field("password", "123456")
async with session.post(
"https://httpbin.org/post",
data=form_data,
timeout=timeout
) as res3:
print(await res3.json())
# 运行异步函数
if __name__ == "__main__":
asyncio.run(aiohttp_base_demo())
2. 异步高并发请求(核心优势)
aiohttp对高并发的支持更极致,适合批量请求(如爬虫爬取千级/万级链接),核心还是asyncio.gather执行多任务。
python
import asyncio
import aiohttp
# 单个请求的异步函数
async def fetch_url(session, url):
try:
async with session.get(url, timeout=aiohttp.ClientTimeout(total=5)) as res:
return f"{url} | 状态码:{res.status}"
except Exception as e:
return f"{url} | 失败:{str(e)}"
async def aiohttp_concurrent_demo():
# 待请求的链接列表(模拟高并发)
urls = [f"https://httpbin.org/get?n={i}" for i in range(20)]
async with aiohttp.ClientSession() as session:
# 创建所有异步任务
tasks = [fetch_url(session, url) for url in urls]
# 并发执行,返回结果按任务顺序排列
results = await asyncio.gather(*tasks)
for res in results:
print(res)
if __name__ == "__main__":
asyncio.run(aiohttp_concurrent_demo())
3. 核心进阶用法
(1)WebSocket异步通信(aiohttp的特色,httpx支持但不如aiohttp成熟)
适合实时通信场景(如和WebSocket服务端交互、推送消息):
python
import asyncio
import aiohttp
async def websocket_demo():
async with aiohttp.ClientSession() as session:
# 连接WebSocket服务端(示例用公共测试地址)
async with session.ws_connect("wss://echo.websocket.org") as ws:
# 发送消息
await ws.send_str("Hello aiohttp!")
# 接收响应
msg = await ws.receive()
if msg.type == aiohttp.WSMsgType.TEXT:
print("收到WebSocket消息:", msg.data) # 输出:Hello aiohttp!
# 关闭连接
await ws.close()
asyncio.run(websocket_demo())
(2)aiohttp作为简易HTTP服务端
aiohttp不仅是客户端,还能快速搭建异步HTTP服务端(轻量,适合测试/微服务):
python
from aiohttp import web
# 定义路由处理函数
async def hello(request):
return web.Response(text="Hello aiohttp Server!")
# 创建app并注册路由
app = web.Application()
app.add_routes([web.get('/', hello)]) # GET请求,根路径
# 运行服务端(默认地址:127.0.0.1:8080)
if __name__ == "__main__":
web.run_app(app, host="127.0.0.1", port=8080)
运行后访问http://127.0.0.1:8080,会返回Hello aiohttp Server!。
(3)大文件流式下载(异步流式处理,避免占用过多内存)
python
import asyncio
import aiohttp
async def stream_download():
async with aiohttp.ClientSession() as session:
async with session.get("https://httpbin.org/image/jpeg", timeout=60) as res:
# 以二进制流式写入文件
with open("demo.jpg", "wb") as f:
async for chunk in res.content.iter_chunked(1024): # 每次读取1024字节
f.write(chunk)
print("文件下载完成")
asyncio.run(stream_download())
三、httpx 0.28.1 vs aiohttp 3.13.1 核心区别&选型建议
这是实际开发中最关键的点,避免选错库,核心区别和适用场景总结如下:
| 维度 | httpx 0.28.1 | aiohttp 3.13.1 |
|---|---|---|
| 同步/异步 | 双支持(同步兼容requests,异步轻量) | 纯异步(无同步API) |
| 核心定位 | 通用HTTP客户端(替代requests) | 异步HTTP客户端+服务端(专注高并发) |
| 性能 | 异步性能优秀,同步和requests持平 | 异步性能更优(底层纯异步优化) |
| WebSocket支持 | 支持,但功能较基础 | 原生深度支持,功能完善 |
| 服务端功能 | 弱(仅简易支持) | 强(可搭建生产级异步服务端) |
| 学习成本 | 低(同步和requests一致,异步易上手) | 中(需熟悉异步,API和requests不同) |
| 生态配合 | 同步/异步场景都能配合 | 仅配合异步生态(asyncio/aiomysql等) |
选型建议
-
选httpx:
- 你熟悉requests,想无缝迁移,同时需要偶尔用异步;
- 项目需要同步+异步混合的HTTP请求;
- 快速开发,追求低学习成本,无需复杂的异步特性(如WebSocket、异步服务端)。
-
选aiohttp:
- 项目是纯异步架构(如异步爬虫、异步微服务),追求极致的高并发性能;
- 需要WebSocket异步通信、大文件异步流式处理;
- 想要一个轻量的异步HTTP服务端(无需Django/Flask);
- 大规模高并发请求场景(如万级链接爬取)。
四、两个库的通用注意事项
-
超时设置 :必须显式设置超时,避免请求因网络问题无限阻塞,两个库都有专属的超时配置类;
-
连接复用 :优先使用
with语句创建会话(Client/AsyncClient/ClientSession),复用连接池,提升性能; -
异常处理 :实际开发中要捕获HTTP异常(如4xx/5xx)、网络异常(如连接失败),两个库都提供了异常类(如
httpx.HTTPError、aiohttp.ClientError); -
高并发限制 :异步高并发时不要创建无限多的任务,建议用**信号量(Semaphore)**限制并发数,避免被服务端封禁或本地资源耗尽:
python# 以aiohttp为例,限制最大并发10 semaphore = asyncio.Semaphore(10) async def fetch_url(session, url): async with semaphore: # 加锁 async with session.get(url) as res: return await res.text()
总结
- httpx 0.28.1 是通用型HTTP客户端,同步兼容requests、异步轻量易上手,适合大部分同步/异步混合场景,是requests的最佳替代;
- aiohttp 3.13.1 是纯异步HTTP客户端+服务端,异步性能更优、支持WebSocket和异步服务端开发,适合纯异步高并发场景;
- 选型核心:需要同步/低学习成本选httpx,纯异步/高并发/WebSocket/服务端选aiohttp;
- 两个库的通用最佳实践:显式设置超时、用with语句管理会话、高并发时限制并发数、做好异常处理。