Python 实现HTTP Client 的常见方式总览

 更新时间:2026年02月13日 09:43:12   作者:破烂pan  
本文总结了Python实现HTTPClient的常见方式,包括urllib、requests、httpx、aiohttp等库的优缺点和适用场景,同时,还介绍了如何优雅地设计HTTPClient,并给出了选型建议和进阶建议,感兴趣的朋友跟随小编一起看看吧

一、Python 实现 HTTP Client 的常见方式总览

Python 常见 HTTP Client 实现方式:

类型代表库是否异步推荐程度
标准库urllib否(了解即可)
第三方同步requests否
第三方现代同步/异步httpx支持(强烈推荐)
异步高性能aiohttp是
框架内置FastAPI / Django 内部 client视情况场景依赖
底层socket否(特殊场景)

二、urllib(标准库)

1. 是什么?

Python 标准库自带的 HTTP 工具。

import urllib.request

不需要安装第三方库。

2. 有什么用?

  • 基础 HTTP 请求
  • 简单下载文件
  • 受限环境下使用(如不能安装第三方库)

3. 怎么用?

import urllib.request
import json
url = "https://api.example.com/data"
req = urllib.request.Request(url, method="GET")
with urllib.request.urlopen(req) as response:
    data = response.read()
    print(json.loads(data))

POST 示例:

import urllib.parse
data = urllib.parse.urlencode({"key": "value"}).encode()
req = urllib.request.Request(url, data=data, method="POST")

4. 如何优雅地用?

❌ 不优雅点:

  • API 复杂
  • 异常处理繁琐
  • JSON 解析不自动
  • 没有 session 管理

建议:

  • 仅用于脚本
  • 不用于生产服务

5. 适用场景

  • 无法安装第三方库
  • 教学
  • 简单脚本

三、requests(最常用同步方案)

1. 是什么?

Python 最流行的 HTTP 库。

pip install requests

2. 有什么用?

  • 微服务调用
  • 第三方 API 调用
  • 简单同步 HTTP 请求
  • 内部工具系统

3. 怎么用?

基本 GET

import requests
resp = requests.get("https://api.example.com/data")
print(resp.status_code)
print(resp.json())

POST

resp = requests.post(
    "https://api.example.com/login",
    json={"username": "pan", "password": "123"},
    timeout=5
)

4. 如何优雅地用?

使用 Session 复用连接

session = requests.Session()
session.headers.update({
    "Authorization": "Bearer token"
})
resp = session.get("https://api.example.com/data")

好处:

  • TCP 连接复用
  • 性能提升
  • 统一 header 管理

设置 timeout(必须)

requests.get(url, timeout=(3, 10))  # (connect, read)

否则:

  • 可能无限阻塞
  • 生产事故常见坑

异常处理规范

try:
    resp = requests.get(url, timeout=5)
    resp.raise_for_status()
except requests.exceptions.Timeout:
    ...
except requests.exceptions.RequestException:
    ...

❌ requests 的问题

  • 不支持原生 async
  • 高并发场景性能差
  • 不适合 IO 密集型服务

5. 适用场景

场景是否推荐
内部工具
管理后台
高并发服务❌
异步框架❌

四、httpx(现代最佳实践)

强烈推荐 3 年经验工程师重点掌握

1. 是什么?

  • requests 的升级版
  • 支持同步 + 异步
  • 支持 HTTP/2
  • API 风格接近 requests
pip install httpx

2. 有什么用?

  • 微服务调用
  • 异步高并发系统
  • 替代 requests
  • Tornado / FastAPI 等场景

3. 怎么用?

同步用法

import httpx
with httpx.Client(timeout=5.0) as client:
    resp = client.get("https://api.example.com/data")
    print(resp.json())

异步用法(重点)

import httpx
import asyncio
async def main():
    async with httpx.AsyncClient(timeout=5.0) as client:
        resp = await client.get("https://api.example.com/data")
        print(resp.json())
asyncio.run(main())

4. 如何优雅地用(重点)

1. 全局复用 Client

❌ 错误写法:

async def handler():
    async with httpx.AsyncClient() as client:
        await client.get(url)

这样每次都会新建连接池。

正确写法:

client = httpx.AsyncClient(timeout=5.0)
async def handler():
    resp = await client.get(url)

2. 配置连接池

limits = httpx.Limits(
    max_connections=100,
    max_keepalive_connections=20
)
client = httpx.AsyncClient(limits=limits)

3. 分离连接超时

timeout = httpx.Timeout(
    connect=3.0,
    read=10.0,
    write=5.0,
    pool=3.0
)

4. 使用重试机制(结合 tenacity)

from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
async def fetch():
    return await client.get(url)

5. 统一封装一层

推荐封装:

class HttpClient:
    def __init__(self):
        self.client = httpx.AsyncClient(timeout=5.0)
    async def get(self, url, **kwargs):
        resp = await self.client.get(url, **kwargs)
        resp.raise_for_status()
        return resp.json()

5. 适用场景

场景是否推荐
微服务调用
异步系统
高并发 IO
替代 requests

五、aiohttp(异步老牌选手)

1. 是什么?

早期 Python 异步 HTTP 主力库。

pip install aiohttp

2. 怎么用?

import aiohttp
import asyncio
async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get("https://api.example.com") as resp:
            print(await resp.json())
asyncio.run(main())

3. 特点

优点缺点
性能高API 不如 httpx 友好
社区成熟与 requests 不兼容

4. 适用场景

  • 老项目
  • 纯 asyncio 系统

新项目更推荐 httpx。

六、如何优雅地设计 HTTP Client(架构层)

这是 3 年工程师需要掌握的部分。

1. 统一出口

不要在业务代码里到处写:

httpx.get(...)

应该:

from infra.http import http_client
await http_client.get(...)

2. 加指标埋点

start = time.perf_counter()
resp = await client.get(url)
cost = time.perf_counter() - start

记录:

  • QPS
  • P50 / P99
  • error_rate

3. 熔断 & 限流

结合:

  • tenacity(重试)
  • aiobreaker(熔断)
  • asyncio.Semaphore(限流)

4. 不要踩的坑

坑说明
不设置 timeout生产事故高发
每次新建 client连接爆炸
不处理异常上游抖动拖死系统
不做限流被下游打死

七、选型建议总结

内部小工具

requests

微服务调用

httpx + 连接池 + 重试

高并发异步系统

httpx.AsyncClient

老 asyncio 项目

aiohttp

八、给 3 年工程师的进阶建议

你应该掌握的不只是用法,而是:

  1. HTTP 连接池原理
  2. TCP keepalive
  3. TIME_WAIT 问题
  4. DNS 解析缓存
  5. 超时分层设计(connect / read / pool)
  6. 上游依赖治理

九、最终推荐结论

如果你现在问:

2026 年 Python HTTP Client 推荐什么?

答案是:

httpx.AsyncClient

同步场景用:

httpx.Client

如果你愿意,我可以再给你一份:

  • 面向生产的 HTTP Client 封装模板
  • 高并发翻译系统 HTTP 调优实践
  • Tornado + httpx 的最佳实践架构图

你现在的技术栈我大概了解一点,如果结合你的翻译高 IO 场景,我可以给你一版专门针对“高并发外部 API 调用”的优化方案。

到此这篇关于Python 实现 HTTP Client 的常见方式的文章就介绍到这了,更多相关Python HTTP Client内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现五子棋人机对战 和人人对战

    Python实现五子棋人机对战 和人人对战

    这篇文章主要介绍了Python实现五子棋人机对战 和人人对战,通过定义黑白子,落子位置以及获胜规则展开详细内容,需要的小伙伴可以参考一下
    2022-05-05
  • Python使用psutil获取系统信息

    Python使用psutil获取系统信息

    这篇文章介绍了Python使用psutil获取系统信息的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • PyTorch 成功安装验证的方法小结

    PyTorch 成功安装验证的方法小结

    这篇文章主要介绍了PyTorch 成功安装验证的方法小结,分享几种验证PyTorch是否安装成功的方法,确认PyTorch是否工作正常非常重要,可以避免后续的问题,需要的朋友可以参考下
    2023-11-11
  • python 读取.csv文件数据到数组(矩阵)的实例讲解

    python 读取.csv文件数据到数组(矩阵)的实例讲解

    今天小编就为大家分享一篇python 读取.csv文件数据到数组(矩阵)的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python双向链表实现实例代码

    python双向链表实现实例代码

    python双向链表和单链表类似,只不过是增加了一个指向前面一个元素的指针,下面的代码实例了python双向链表的方法
    2013-11-11
  • 基于Python实现实时监控CPU使用率

    基于Python实现实时监控CPU使用率

    这篇文章主要为大家介绍了一款手写编程代码的小脚本,能够轻松在界面上展示:利用Python实时监控CPU使用率,随时展现。也无需下载管理软件,感兴趣的可以了解一下
    2022-04-04
  • 基于Python的数据分析与可视化

    基于Python的数据分析与可视化

    在当今数字化时代,数据分析和可视化已经成为了企业和个人必备的技能,Python 作为一种高级编程语言,具有易学易用、高效快捷的特点,在数据科学领域中得到了广泛应用,本篇文章将介绍基于 Python 的数据分析与可视化
    2023-07-07
  • Python collections模块使用方法详解

    Python collections模块使用方法详解

    这篇文章主要介绍了Python collections模块使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python输入圆半径,计算圆周长和面积的实现方式

    Python输入圆半径,计算圆周长和面积的实现方式

    这篇文章主要介绍了Python输入圆半径,计算圆周长和面积的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • python中isalpha () 和 isdigit ()的区别小结

    python中isalpha () 和 isdigit ()的区别小结

    本文主要介绍了python中isalpha () 和 isdigit ()的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04

最新评论