aiohttp、httpx 和 requests 的区别
先说结论,没有意外就用httpx,因为最牛的的openai接口用httpx,和FastAPI无缝兼容。
- httpx 是一个现代化的 HTTP 客户端,支持同步和异步操作
- 完全支持 async/await 语法
- API 设计更简洁,更接近 requests 的使用方式
- 支持 HTTP/1.1 和 HTTP/2
- 与 FastAPI 完美配合
aiohttp
、httpx
和 requests
都是 Python 中用于发送 HTTP 请求的库,但它们在功能、性能和使用场景上存在显著差异,不能简单地认为它们是“同样功能”的库。以下是它们的主要区别和特点:
1. 功能特点
功能/特性 | requests | httpx | aiohttp |
---|---|---|---|
同步/异步 | 同步阻塞 | 同步和异步支持 | 异步非阻塞 |
并发性 | 不支持并发 | 支持并发 | 支持并发 |
HTTP/2 支持 | 不支持 | 支持 | 支持 |
WebSocket 支持 | 不支持 | 支持 | 支持 |
中间件支持 | 不支持 | 不支持 | 支持 |
流式处理 | 不支持 | 支持 | 支持 |
易用性 | 简单易用 | 中等 | 较复杂 |
用例 | 简单项目/原型设计 | 高性能客户端 | 服务器、分布式网络、高并发场景 |
2. 性能
-
**
requests
**:性能较低,适合简单同步请求。 -
**
httpx
**:性能较高,适合并发请求,支持 HTTP/2。 -
**
aiohttp
**:性能最高,适合高并发场景,支持 HTTP/2。
3. 适用场景
-
**
requests
**:适合简单的同步 HTTP 请求,适合快速开发和原型设计。 -
**
httpx
**:适合需要高性能和现代功能(如 HTTP/2、WebSocket)的客户端应用。 -
**
aiohttp
**:适合构建高性能的异步 Web 服务器、分布式网络或高并发的客户端。
4. 代码示例
requests
(同步)
import requests
response = requests.get("https://example.com")
print(response.text)
httpx
(同步)
import httpx
response = httpx.get("https://example.com")
print(response.text)
httpx
(异步)
import httpx
import asyncio
async def main():
async with httpx.AsyncClient() as client:
response = await client.get("https://example.com")
print(response.text)
asyncio.run(main())
aiohttp
(异步)
import aiohttp
import asyncio
async def main():
async with aiohttp.ClientSession() as session:
async with session.get("https://example.com") as response:
print(await response.text())
asyncio.run(main())
关于 requests
、httpx
和 aiohttp
的维护状态:
1. Requests
-
维护状态:
requests
的维护情况较为复杂。虽然项目已捐赠给 Python 软件基金会,但其创始人 Kenneth Reitz 已很少参与开发。目前,requests
的官网域名已过期,且维护者表示已联系 Kenneth 但未得到回应。社区对 Kenneth 的行为也存在一些争议。 -
未来展望:由于维护者减少且域名问题未解决,
requests
的长期维护存在不确定性。
2. HTTPX
-
维护状态:
httpx
仍在积极维护中。它是一个较新的库,支持同步和异步操作,并且兼容 HTTP/2 和 WebSocket。其文档和社区支持良好,适用于现代的 HTTP 客户端开发。 -
未来展望:
httpx
作为requests
的替代品之一,仍在不断更新和改进,适合需要高性能和现代功能的开发者。
3. AIOHTTP
-
维护状态:
aiohttp
也在持续维护中。它是一个异步 HTTP 客户端和服务器框架,适用于高并发场景。其维护团队由多位贡献者组成,包括 Nikolay Kim 和 Andrew Svetlov。 -
未来展望:
aiohttp
保持了良好的向后兼容性,并且社区活跃,适合需要异步功能的项目。
总结
-
**
requests
**:维护状态不稳定,存在不确定性。 -
**
httpx
**:积极维护中,适合现代开发需求。 -
**
aiohttp
**:持续维护,适合异步和高并发场景。