HTTPX简介

HTTPX 是 Python 的一个现代 HTTP 客户端库,用于发送 HTTP 请求和处理响应。它是 requests 库的升级替代品,提供了同步和异步 API,支持 HTTP/1.1 和 HTTP/2,适合构建高性能的 Web 应用、API 调用和网络爬虫。以下是它的主要功能和用途:

主要功能

  • 同步和异步支持
  • 同步 API:类似 requests,适合简单脚本或顺序请求。
  • 异步 API:基于 asynciotrio,适合高并发场景,如同时处理多个请求。
  • 示例:
# 同步
import httpx
response = httpx.get("https://example.com")
print(response.text)

# 异步
import asyncio
import httpx
async def main():
    async with httpx.AsyncClient() as client:
        response = await client.get("https://example.com")
        print(response.text)
asyncio.run(main())
  • HTTP/2 和连接池
  • 支持 HTTP/2,提升性能,尤其在高流量场景。
  • 内置连接池,复用 TCP 连接,减少请求延迟。
  • 功能丰富
  • 请求自定义:支持自定义 headers、查询参数、表单数据、JSON、文件上传等。
  • 响应处理:自动解码 gzip、deflate 等压缩格式,支持 JSON 解析、流式响应。
  • 超时控制:严格的超时设置,避免请求挂起。
  • 认证支持:内置基本认证、OAuth 等机制。
  • WebSocket 支持:适合实时应用。
  • 命令行客户端:通过 pip install 'httpx[cli]' 安装,可直接从终端发送请求。
  • 与 WSGI/ASGI 集成
  • 可直接向 WSGI/ASGI 应用发送请求,方便测试 Web 框架(如 Flask、FastAPI)。
  • 类型注解
  • 完全类型化,支持静态类型检查,适合现代 Python 开发。

主要用途

  • API 调用:与 RESTful API 交互,发送 GET、POST 等请求,处理 JSON 数据。
  • Web 爬虫:抓取网页内容,支持流式处理大文件或实时数据。
  • 实时应用:通过 WebSocket 处理实时通信。
  • 测试:测试 Web 应用或 API 端点,模拟客户端行为。
  • 高并发任务:异步请求适合批量处理或高吞吐量场景,如批量 API 调用或爬虫。

requests 的对比

  • 相似性:API 设计类似 requests,易于迁移。
  • 优势
  • 支持异步和 HTTP/2,性能更强。
  • 更现代的设计(类型注解、WebSocket)。
  • 内置命令行工具。
  • 劣势:对于简单同步任务,requests 可能更轻量。

安装

pip install httpx
# 可选:安装 CLI 和 HTTP/2 支持
pip install 'httpx[cli,http2]'

实际场景示例

  1. API 调用
   import httpx
   headers = {"Authorization": "Bearer token"}
   response = httpx.get("https://api.example.com/data", headers=headers)
   print(response.json())
  1. 上传文件
   import httpx
   files = {"file": open("report.pdf", "rb")}
   response = httpx.post("https://example.com/upload", files=files)
   print(response.status_code)
  1. 异步并发请求
   import asyncio
   import httpx
   async def fetch_url(client, url):
       response = await client.get(url)
       return response.text
   async def main():
       async with httpx.AsyncClient() as client:
           tasks = [fetch_url(client, f"https://example.com/page/{i}") for i in range(5)]
           results = await asyncio.gather(*tasks)
           print(results)
   asyncio.run(main())

注意事项

  • 性能优化:使用 httpx.Clienthttpx.AsyncClient 复用连接,避免每次请求创建新连接。
  • 安全性:始终使用 HTTPS,谨慎处理敏感信息(如凭据)。
  • 文档:官方文档(https://www.python-httpx.org)提供详细指南和高级用法。

总结

HTTPX 是一个功能强大、性能优越的 HTTP 客户端库,适合从简单 API 调用到复杂异步爬虫的各种场景。它结合了 requests 的易用性和现代 Python 的高性能特性,是 Python 网络编程的首选工具之一。

评论

发表回复

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 知差(chai)网