news 2026/4/28 13:21:53

Python22_httpx网络请求

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python22_httpx网络请求

Python22_httpx网络请求

httpx.AsyncClient,这是 Python 中处理异步 HTTP 请求的核心类。

httpx.AsyncClient 概览

httpx.AsyncClientHTTPX库的异步客户端,基于asyncio构建,支持非阻塞的 HTTP/1.1 和 HTTP/2 请求,性能远超同步的requests库。


基本使用

1. 安装

pipinstallhttpx# 如需 HTTP/2 支持pipinstallhttpx[http2]

2. 简单请求

importhttpximportasyncioasyncdefmain():# 创建客户端(推荐用 async with 管理生命周期)asyncwithhttpx.AsyncClient()asclient:# GET 请求response=awaitclient.get("https://api.github.com")print(response.status_code)# 200print(response.json())# 解析 JSONasyncio.run(main())

核心特性详解

3. 请求方法

asyncwithhttpx.AsyncClient()asclient:# 各类 HTTP 方法r1=awaitclient.get(url,params={"key":"value"})r2=awaitclient.post(url,json={"data":"value"})# JSON 体r3=awaitclient.post(url,data={"form":"field"})# 表单数据r4=awaitclient.put(url,content=b"raw bytes")# 原始字节r5=awaitclient.patch(url,files={"file":open("a.jpg","rb")})r6=awaitclient.delete(url)r7=awaitclient.head(url)r8=awaitclient.options(url)

4. 高级配置

client=httpx.AsyncClient(# 超时设置(连接、读取、写入)timeout=httpx.Timeout(10.0,connect=5.0),# 请求头headers={"User-Agent":"MyApp/1.0"},# 基础 URL(后续请求可写相对路径)base_url="https://api.example.com/v1",# 启用 HTTP/2http2=True,# 跟随重定向follow_redirects=True,# 验证 SSL(开发时可关闭)verify=True,# 或 verify=False(不推荐生产环境)# 代理proxies="http://localhost:8080",# 或按协议区分:proxies={"http://": "...", "https://": "..."}# 认证auth=("username","password"),# Basic Auth# 或 auth=httpx.BearerToken("token")# Cookie 持久化cookies={"session":"abc123"},# 限制连接池limits=httpx.Limits(max_connections=100,max_keepalive_connections=20))# 使用 base_url 后response=awaitclient.get("/users")# 实际请求 https://api.example.com/v1/users

5. 并发请求(核心优势)

importasyncioimporthttpxasyncdeffetch(client,url):response=awaitclient.get(url)returnresponse.json()asyncdefmain():urls=["https://api.github.com/users/octocat","https://api.github.com/users/torvalds","https://api.github.com/users/gvanrossum"]asyncwithhttpx.AsyncClient()asclient:# 并发执行所有请求tasks=[fetch(client,url)forurlinurls]results=awaitasyncio.gather(*tasks)print(results)asyncio.run(main())

6. 流式响应(大文件下载)

asyncwithhttpx.AsyncClient()asclient:# 流式读取,避免内存溢出asyncwithclient.stream("GET","https://example.com/large-file.zip")asresponse:asyncforchunkinresponse.aiter_bytes():# 处理每个数据块print(f"Received{len(chunk)}bytes")# 或流式文本asyncwithclient.stream("GET",url)asresponse:asyncforlineinresponse.aiter_lines():print(line)

7. 请求/响应钩子

deflog_request(request):print(f"→ Request:{request.method}{request.url}")deflog_response(response):print(f"← Response:{response.status_code}")asyncwithhttpx.AsyncClient(event_hooks={"request":[log_request],"response":[log_response]})asclient:awaitclient.get("https://httpbin.org/get")

与同步 Client 对比

特性httpx.Clienthttpx.AsyncClient
执行方式同步阻塞异步非阻塞
适用场景脚本、简单任务高并发、Web 服务
性能一般极高(可处理数千并发)
使用方式with client:async with client:
依赖无额外依赖需要asyncio

最佳实践

importhttpximportasyncioclassAPIClient:"""封装示例:带重试和错误处理的异步客户端"""def__init__(self):self.client=httpx.AsyncClient(base_url="https://api.example.com",timeout=30.0,http2=True,limits=httpx.Limits(max_connections=50))asyncdef__aenter__(self):returnselfasyncdef__aexit__(self,*args):awaitself.client.aclose()# 确保关闭asyncdefget_user(self,user_id:int):try:response=awaitself.client.get(f"/users/{user_id}")response.raise_for_status()# 自动抛出 4xx/5xx 异常returnresponse.json()excepthttpx.HTTPStatusErrorase:print(f"HTTP error:{e.response.status_code}")raiseexcepthttpx.RequestErrorase:print(f"Request failed:{e}")raise# 使用asyncdefmain():asyncwithAPIClient()asapi:user=awaitapi.get_user(123)print(user)asyncio.run(main())

常见异常处理

异常说明
httpx.RequestError网络连接错误
httpx.HTTPStatusErrorHTTP 错误状态码(需调用raise_for_status()
httpx.TimeoutException请求超时
httpx.ConnectError连接失败

httpx.AsyncClient是现代 Python 异步编程中处理 HTTP 请求的首选工具,特别适合FastAPI/Starlette等异步 Web 框架的后端服务调用。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 16:54:37

GEE批量处理ERA5-Land:从小时数据到年度气候指标(温度与降水)

1. ERA5-Land数据与GEE平台简介 ERA5-Land是欧洲中期天气预报中心(ECMWF)推出的高分辨率陆地再分析数据集。这个数据集通过重新运行ERA5气候再分析系统的陆地分量,将空间分辨率提升到约9公里,比ERA5的31公里分辨率精细得多。这种高…

作者头像 李华
网站建设 2026/4/16 16:51:12

PZEM-004T v3.0实战指南:6个步骤构建工业级电力监测系统

PZEM-004T v3.0实战指南:6个步骤构建工业级电力监测系统 【免费下载链接】PZEM-004T-v30 Arduino library for the Updated PZEM-004T v3.0 Power and Energy meter 项目地址: https://gitcode.com/gh_mirrors/pz/PZEM-004T-v30 PZEM-004T v3.0是一款基于Mod…

作者头像 李华
网站建设 2026/4/16 16:51:04

知识竞赛软件的数据存储与备份方案

💾 知识竞赛软件的数据存储与备份方案构建稳固的数据基石 守护竞赛核心资产📌 引言:数据是知识竞赛的核心资产在数字化竞赛时代,知识竞赛软件承载着从题库、赛制到选手成绩的全部关键信息。一次成功的竞赛活动,不仅依…

作者头像 李华
网站建设 2026/4/16 16:48:15

云原生业务中台如何提升8%售罄率?某体育品牌库存优化全流程拆解

云原生业务中台如何提升8%售罄率?某体育品牌库存优化全流程拆解 在电商与零售行业,库存管理一直是决定企业盈利能力的关键因素。传统零售企业普遍面临高库存与高缺货并存的矛盾——仓库里堆满滞销商品的同时,热销款却频频断货。这种看似荒谬的…

作者头像 李华
网站建设 2026/4/16 16:46:31

Tsuru平台自动化运维工具:10个高效管理技巧提升团队生产力

Tsuru平台自动化运维工具:10个高效管理技巧提升团队生产力 【免费下载链接】tsuru Open source and extensible Platform as a Service (PaaS). 项目地址: https://gitcode.com/gh_mirrors/ts/tsuru Tsuru是一款开源且可扩展的Platform as a Service (PaaS)平…

作者头像 李华