python环境搭建 (十三) httpx和aiohttp

httpx==0.28.1aiohttp==3.13.1这两个Python主流HTTP库的核心功能、使用方法,以及各自的适用场景,我会从核心定位+功能亮点+基础使用+进阶用法+核心区别几个维度讲清楚,兼顾新手易上手和实际开发常用场景,两个库的用法都会提供可直接运行的代码示例。

一、httpx==0.28.1 详解

核心定位

httpx是Python新一代HTTP客户端库,同时支持同步和异步请求 ,是requests库的完美替代(API和requests高度兼容,上手无成本),还解决了requests不支持异步、对HTTP/2支持不佳的问题,0.28.1是稳定版,兼容Python3.8+。

核心功能亮点
  1. 同步/异步API双支持,切换仅需修改少量代码;
  2. 完全兼容requests的API,学过requests就能直接用;
  3. 支持HTTP/1.1和HTTP/2,支持HTTPS、代理、Cookie、会话保持;
  4. 内置连接池,性能优于原生requests;
  5. 支持流式请求/响应、文件上传下载,支持自定义请求头/超时。
安装
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. 进阶用法(常用)
  1. HTTP/2支持 :创建客户端时指定http2=True即可,无需修改其他代码;

    python 复制代码
    with httpx.Client(http2=True) as client:
        res = client.get("https://www.baidu.com")
        print("HTTP版本:", res.http_version)  # HTTP/2
  2. 代理设置 :支持http/https/socks代理;

    python 复制代码
    proxies = {
        "http://": "http://127.0.0.1:8080",
        "https://": "http://127.0.0.1:8080"
    }
    httpx.get("https://httpbin.org/get", proxies=proxies)
  3. 文件上传 :直接传files参数,和requests一致;

    python 复制代码
    files = {"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客户端库之一,常和asyncioaiomysql等异步库配合使用。

核心功能亮点
  1. 纯异步实现,高并发性能优于httpx的异步模式(专注异步,做了更多底层优化);
  2. 同时支持客户端(Client)服务端(Server)(httpx主要是客户端,服务端功能较弱);
  3. 支持HTTP/1.1、HTTPS、代理、Cookie、会话保持、连接池;
  4. 支持流式请求/响应、大文件上传下载(对异步流式处理支持更友好);
  5. 支持WebSocket异步通信(实时通信场景,如聊天、推送);
  6. 轻量可扩展,适合构建异步微服务、高并发爬虫。
安装
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等)
选型建议
  1. 选httpx

    • 你熟悉requests,想无缝迁移,同时需要偶尔用异步;
    • 项目需要同步+异步混合的HTTP请求;
    • 快速开发,追求低学习成本,无需复杂的异步特性(如WebSocket、异步服务端)。
  2. 选aiohttp

    • 项目是纯异步架构(如异步爬虫、异步微服务),追求极致的高并发性能;
    • 需要WebSocket异步通信、大文件异步流式处理;
    • 想要一个轻量的异步HTTP服务端(无需Django/Flask);
    • 大规模高并发请求场景(如万级链接爬取)。

四、两个库的通用注意事项

  1. 超时设置必须显式设置超时,避免请求因网络问题无限阻塞,两个库都有专属的超时配置类;

  2. 连接复用 :优先使用with语句创建会话(Client/AsyncClient/ClientSession),复用连接池,提升性能;

  3. 异常处理 :实际开发中要捕获HTTP异常(如4xx/5xx)、网络异常(如连接失败),两个库都提供了异常类(如httpx.HTTPErroraiohttp.ClientError);

  4. 高并发限制 :异步高并发时不要创建无限多的任务,建议用**信号量(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()

总结

  1. httpx 0.28.1通用型HTTP客户端,同步兼容requests、异步轻量易上手,适合大部分同步/异步混合场景,是requests的最佳替代;
  2. aiohttp 3.13.1纯异步HTTP客户端+服务端,异步性能更优、支持WebSocket和异步服务端开发,适合纯异步高并发场景;
  3. 选型核心:需要同步/低学习成本选httpx,纯异步/高并发/WebSocket/服务端选aiohttp
  4. 两个库的通用最佳实践:显式设置超时、用with语句管理会话、高并发时限制并发数、做好异常处理。
相关推荐
Allen_LVyingbo1 小时前
医疗AI新范式:当数理模型开始“计算”生命,传统大模型面临重构(中)
开发语言·人工智能·python·自然语言处理·重构·知识图谱
时艰.2 小时前
Java 线程池 — ThreadPoolExecutor
java·开发语言·python
七夜zippoe2 小时前
时间序列分析实战:从平稳性检验到Prophet与LSTM预测
人工智能·python·机器学习·arima·时间序列·prophet
暖馒2 小时前
深度剖析串口通讯(232/485)
开发语言·c#·wpf·智能硬件
新新学长搞科研2 小时前
【CCF主办 | 高认可度会议】第六届人工智能、大数据与算法国际学术会议(CAIBDA 2026)
大数据·开发语言·网络·人工智能·算法·r语言·中国计算机学会
多恩Stone2 小时前
【3D-AICG 系列-2】Trellis 2 的O-voxel (上) Shape: Flexible Dual Grid
人工智能·python·算法·3d·aigc
梵刹古音4 小时前
【C语言】 字符数组相关库函数
c语言·开发语言·算法
AAD555888998 小时前
数字仪表LCD显示识别与读数:数字0-9、小数点及单位kwh检测识别实战
python
微风中的麦穗10 小时前
【MATLAB】MATLAB R2025a 详细下载安装图文指南:下一代科学计算与工程仿真平台
开发语言·matlab·开发工具·工程仿真·matlab r2025a·matlab r2025·科学计算与工程仿真