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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux下python抓屏实现方法

    linux下python抓屏实现方法

    这篇文章主要介绍了linux下python抓屏实现方法,涉及Python操作屏幕截取的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Python中numpy数组的计算与转置详解

    Python中numpy数组的计算与转置详解

    大家好,本篇文章主要讲的是Python中numpy数组的计算与转置详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 亲手教你实现pynq-z2条形码识别功能

    亲手教你实现pynq-z2条形码识别功能

    这篇文章主要介绍了pynq-z2条形码识别功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • pyftplib中文乱码问题解决方案

    pyftplib中文乱码问题解决方案

    这篇文章主要介绍了pyftplib中文乱码问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 彻底搞懂Python字符编码

    彻底搞懂Python字符编码

    本篇文章带领大家彻底搞懂Python字符编码的一些知识,及python字符编码的一些基础概念,需要的朋友可以参考下
    2018-01-01
  • Python jpg快速转png并调整大小方式

    Python jpg快速转png并调整大小方式

    这篇文章主要介绍了Python实现jpg快速转png并调整大小方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • python统计cpu利用率的方法

    python统计cpu利用率的方法

    这篇文章主要介绍了python统计cpu利用率的方法,涉及Python中win32pdh模块的使用技巧,需要的朋友可以参考下
    2015-06-06
  • Python屏幕抓取和录制的详细代码示例

    Python屏幕抓取和录制的详细代码示例

    随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,这篇文章主要介绍了Python屏幕抓取和录制的相关资料,需要的朋友可以参考下
    2025-09-09
  • Python数据类型之String字符串实例详解

    Python数据类型之String字符串实例详解

    这篇文章主要介绍了Python数据类型之String字符串,结合实例形式详细讲解了Python字符串的概念、定义、连接、格式化、转换、查找、截取、判断等常见操作技巧,需要的朋友可以参考下
    2019-05-05
  • pycharm中创建sql文件及模板的过程

    pycharm中创建sql文件及模板的过程

    很多小伙伴刚开始使用pycharm时发现以前的老员工在使用pycharm创建sql文件时会自带文件头模板,例如时间、作者、版本、邮件等信息,这是怎么做到的呢,一起来看一下吧
    2022-07-07

最新评论