Niquests 是一个简单、优雅且功能强大的 Python HTTP 客户端,它不仅是 Requests 的“即插即用”替代品,更突破了 Requests 多年的功能停滞状态,原生支持 HTTP/3、连接复用等现代网络特性。下面通过丰富的代码示例来展示它的核心用法。
📦 安装与快速入门
Niquests 的安装非常简单,通过 pip 即可完成:
python -m pip install niquests
如果你需要完整的特性支持(如 HTTP/3、Brotli 压缩等),可以安装可选依赖组:
python -m pip install niquests[speedups] # 包含 orjson 等性能加速库
以下是一个最基础的使用示例,可以看到它与 Requests 的 API 几乎完全一致,但默认就启用了更先进的 HTTP/3 协议:
import niquests# 发送一个简单的 GET 请求r = niquests.get('https://httpbin.org/get')print(r.status_code) # 输出: 200print(r.http_version) # 输出: HTTP/3 (如果服务器支持)print(r.json()) # 自动解析 JSON 响应# 发送 POST 请求r = niquests.post('https://httpbin.org/post', data={'key': 'value'})print(r.text)
⚡ 异步支持
Niquests 同时提供了异步 API,方便在异步编程中使用,性能表现非常出色:
import asyncioimport niquestsasync def fetch_data(): async with niquests.AsyncSession() as session: # 发起异步 GET 请求 response = await session.get('https://api.github.com/events') print(response.status_code) # 200 data = await response.json() # 异步获取 JSON 数据 print(data[0]['type']) # 输出第一个事件的类型asyncio.run(fetch_data())
异步模式下,你可以轻松实现并发请求:
async def fetch_multiple(): async with niquests.AsyncSession() as session: # 同时发起多个异步请求 tasks = [ session.get('https://httpbin.org/get'), session.get('https://httpbin.org/status/200'), session.get('https://httpbin.org/delay/1') ] responses = await asyncio.gather(*tasks) for resp in responses: print(f"{resp.url} -> {resp.status_code}")asyncio.run(fetch_multiple())
🚀 核心高级特性
Niquests 的核心优势在于其对现代网络协议的深度支持,这些功能在 Requests 中无法直接使用。
1. 多协议支持与连接复用
通过 Session 对象并开启 multiplexed=True,Niquests 可以自动协商并优先使用 HTTP/2 或 HTTP/3,并在单个连接上复用请求,大幅提升性能:
import niquests# 创建一个支持连接复用和多协议的会话session = niquests.Session( multiplexed=True, # 开启连接复用 resolver="doh+google://" # 使用 DNS over HTTPS 进行域名解析)# 这些请求会尽可能复用同一个连接urls = [ 'https://cloudflare.com', 'https://www.google.com', 'https://github.com']for url in urls: response = session.get(url) # 查看实际使用的 HTTP 版本 print(f"{url} -> {response.http_version} (OCSP验证: {response.ocsp_verified})")session.close()
2. 细粒度的连接信息
Niquests 提供了比 Requests 更丰富的连接信息,方便进行性能分析和故障排查:
import niquestsr = niquests.get('https://httpbin.org/get')# 查看连接建立的延迟print(f"连接建立耗时: {r.conn_info.established_latency}")# 查看 TLS 版本和加密套件print(f"TLS版本: {r.conn_info.tls_version}")print(f"加密套件: {r.conn_info.cipher}")# 查看服务器证书信息 (以字典形式)print(f"证书主题: {r.conn_info.certificate_dict.get('subject')}")# 检查 OCSP 证书吊销状态print(f"OCSP验证通过: {r.ocsp_verified}")
3. 面向对象的响应头
Niquests 引入了一个有趣的特性——面向对象的响应头(oheaders),让你可以用属性访问的方式获取头信息,使代码更简洁:
r = niquests.get('https://httpbin.org/get')# 传统字典方式访问content_type_dict = r.headers['content-type']# 面向对象方式访问content_type_obj = r.oheaders.content_typeprint(f"Content-Type: {content_type_obj}")# 甚至可以访问更细粒度的信息print(f"媒体类型: {r.oheaders.content_type.content_type}") # application/jsonprint(f"字符集: {r.oheaders.content_type.charset}") # utf-8
🧩 会话与高级配置
Session 对象是 Niquests 的核心,它允许你跨请求保持 cookie、配置持久化参数:
import niquests# 创建会话,配置超时和重试策略session = niquests.Session( timeout=30, # 全局超时 retries=3, # 自动重试次数 max_redirects=5 # 最大重定向次数)# 设置默认 headerssession.headers.update({'User-Agent': 'MyApp/1.0'})# 设置默认认证信息session.auth = ('username', 'password')# 使用会话发起请求,会自动携带上面的配置response = session.get('https://httpbin.org/basic-auth/username/password')print(response.status_code) # 200# 会话还支持上下文管理器,自动关闭连接with niquests.Session() as session: session.get('https://httpbin.org/get') # 会话退出时自动清理资源
🔧 与 Requests 扩展的兼容性
Niquests 虽然是一个全新的实现,但设计上尽量兼容 Requests 的生态。许多 Requests 的第三方扩展可以通过简单的方式适配。
使用 requests-cache 进行请求缓存:
import requests_cacheimport niquests# 创建一个兼容 Niquests 的缓存会话class CacheSession(requests_cache.session.CacheMixin, niquests.Session): pass# 使用缓存会话session = CacheSession()session.cache = requests_cache.create_backend('sqlite', 'cache.db')# 第一次请求会缓存response = session.get('https://httpbin.org/get')# 第二次请求直接从缓存读取response_cached = session.get('https://httpbin.org/get')
适配 responses 进行请求模拟测试:
import responsesimport niquests# 使用 responses 模拟 Niquests 的请求@responses.activatedef test_niquests_mock(): responses.add( responses.GET, 'https://httpbin.org/get', json={'message': 'mocked response'}, status=200 ) # Niquests 的请求会被 responses 拦截 response = niquests.get('https://httpbin.org/get') assert response.json() == {'message': 'mocked response'}test_niquests_mock()
💡 从 Requests 迁移
如果你已有 Requests 代码,迁移到 Niquests 异常简单。只需将导入语句替换,大多数代码无需修改即可运行:
# 原来的 Requests 代码# import requests# response = requests.get('https://api.github.com/events')# 迁移到 Niquestsimport niquests as requests # 直接替换模块名response = requests.get('https://api.github.com/events')print(response.status_code) # 完全相同的 API
当然,你可以利用 Niquests 的新特性逐步优化代码,比如启用连接复用、使用异步版本等。
🌟 总结
Niquests 不仅仅是一个 Requests 的克隆,它代表了 Python HTTP 客户端的一个进化方向。它集成了 HTTP/2、HTTP/3、连接复用、现代 DNS 解析、OCSP 验证等前沿特性,同时又保持了 Requests 简单易用的 API 风格。
对于需要高性能、现代化 HTTP 功能的项目,或者希望简单替换 Requests 来获得额外安全性和性能的场景,Niquests 是一个极具吸引力的选择。