Python3的下一代HTTP客户端——HTTPX

python-httpx 发送http2.0时代请求 在日常开发中,经常会发送各种各样的网络请求。Python中常用的网络请求库有requests、aiohttp、httpx等,httpx是基于Python3的新一代的网络请求库,它的功能很丰富,做个简答的介绍。 httpx是Python新一代的网络请求库,它包含以下特点 特点 基于Python3的功能齐全的http请求模块 既能发送同步请求,也能发送异步请求 支持HTTP/1.1和HTTP/2 能够直接向WSGI应用程序或者ASGI应用程序发送请求 安装 httpx需要Python3.6+(使用异步请求 阅读详情
AI摘要

本文介绍了Python库httpx的安装、基本使用方法,如GET和POST请求,添加Cookie,设置超时,以及异步支持,包括使用AsyncClient进行异步请求和流媒体响应的处理。,

前言

在 Python 中,访问网络资源最有名的库就是 requests、aiohttp 和 httpx。一般情况下,requests 只能发送同步请求;aiohttp 只能发送异步请求;httpx 既能发送同步请求,又能发送异步请求。

下面,就着重介绍一下 httpx 的使用方法。

安装

使用 pip 安装 httpx:

pip install httpx

当然了,httpx 也可以使用命令行操作。不过,需要按如下命令安装。

pip install 'httpx[cli]'

image

命令行测试发送请求:

image

快速入门

发起 GET 请求

直接用 get 方法,如下:

import httpx

r = httpx.get('https://httpbin.org/get')
print(r.status_code)    #状态
print(r.text)   #内容

对于带参数的 URL,传入一个 dict 作为 params 参数,如下:

import httpx

r = httpx.get('https://httpbin.org/get', params={'q': 'python', 'cat': '1001'})
print(r.url)    #实际请求的URL
print(r.text)

对于特定类型的响应,例如 JSON,可以直接获取,如下:

r = httpx.get('https://httpbin.org/get')
r.json()

# {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': ...

对于非文本响应,响应内容也可以以字节的形式访问,如下:

>>> r.content
b'<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>...'

添加 Headers

需要传入 HTTP Header 时,我们传入一个 dict 作为 headers 参数,如下:

r = httpx.get('https://www.baidu.com/', headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'})

获取响应头,如下:

r.headers
# {Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', ...}

r.headers['Content-Type']
# 'text/html; charset=utf-8'

发起 POST 请求

要发送 POST 请求,只需要把 get()方法变成 post(),然后传入 data 参数作为 POST 请求的数据,如下:

r = httpx.post('https://accounts.baidu.com/login', data={'form_email': 'abc@example.com', 'form_password': '123456'})

httpx 默认使用 application/x-www-form-urlencoded 对 POST 数据编码。如果要传递 JSON 数据,可以直接传入 json 参数,如下:

params = {'key': 'value'}
r = httpx.post(url, json=params) #内部自动序列化为JSON

发起二进制请求
content = b'Hello, world'
r = httpx.post("https://httpbin.org/post", content=content)

上传文件

上传文件操作如下:

upload_files = {'upload-file': open('report.xls', 'rb')}
r = httpx.post('https://httpbin.org/post', files=upload_files)

如果需要在上传文件时包含非文件数据字段,请使用 data 参数,如下:

data = {'message': 'Hello, world!'}
files = {'file': open('report.xls', 'rb')}
r = httpx.post("https://httpbin.org/post", data=data, files=files)
print(r.text)

流媒体响应

可以流式传输响应的二进制内容:

>>> with httpx.stream("GET", "https://www.example.com") as r:
...     for data in r.iter_bytes():
...         print(data)

或者返回文本:

>>> with httpx.stream("GET", "https://www.example.com") as r:
...     for text in r.iter_text():
...         print(text)

或者逐行流式传输:

>>> with httpx.stream("GET", "https://www.example.com") as r:
...     for line in r.iter_lines():
...         print(line)

添加 Cookie

在请求中传入 Cookie,只需准备一个 dict 传入 cookies 参数,如下:

cs = {'token': '12345', 'status': 'working'}
r = httpx.get(url, cookies=cs)

httpx 对 Cookie 做了特殊处理,使得我们不必解析 Cookie 就可以轻松获取指定的 Cookie,如下:

r.cookies['token']
# 12345

指定超时

默认超时为 5 秒。要指定超时,传入以秒为单位的 timeout 参数。超时分为连接超时和读取超时,如下:

try:
    # 3.1秒后连接超时,27秒后读取超时
    r = requests.get(url, timeout=(3.1, 27))
except requests.exceptions.RequestException as e:
    print(e)

当然,也可以禁用超时:

httpx.get('https://github.com/', timeout=None)

超时重连
def gethtml(url):
    i = 0
    while i < 3:
        try:
            html = httpx.get(url, timeout=5).text
            return html
        except httpx.exceptions.RequestException:
            i += 1

重定向

默认情况下,httpx 不会遵循所有 HTTP 方法的重定向,不过可以使用 follow_redirects 开启重定向:

>>> r = httpx.get('http://github.com/', follow_redirects=True)
>>> r.url
URL('https://github.com/')
>>> r.status_code
200
>>> r.history
[<Response [301 Moved Permanently]>]

高级用法

使用 httpx.Client() ,实际上是调用 HTTP 链接池。可以带来显著的性能改进。包括:减少跨请求的延迟(无需握手),减少 CPU 使用和往返,减少网络拥塞。

用法

使用 Client 的推荐方式是作为上下文管理器。这将确保在离开 with 块时正确清理连接:

with httpx.Client() as client:
    ...

或者,可以使用.close()显式关闭连接池,而无需使用块:

client = httpx.Client()
try:
    ...
finally:
    client.close()

发送请求

一旦有了 Client,您可以使用.get().post()等发送请求。例如:

>>> with httpx.Client() as client:
...     r = client.get('https://example.com')
...
>>> r
<Response [200 OK]>

跨请求共享配置

Client 允许您通过将参数传递给 Client 构造函数来将配置应用于所有传出请求:

>>> url = 'http://httpbin.org/headers'
>>> headers = {'user-agent': 'my-app/0.0.1'}
>>> with httpx.Client(headers=headers) as client:
...     r = client.get(url)
...
>>> r.json()['headers']['User-Agent']
'my-app/0.0.1'

此外,base_url 允许您为所有传出请求预留 URL:

>>> with httpx.Client(base_url='http://httpbin.org') as client:
...     r = client.get('/headers')
...
>>> r.request.url
URL('http://httpbin.org/headers')

监控下载进度

如果您需要监控大响应的下载进度,您可以使用响应流并检查 responseresponse.num_bytes_downloaded 属性:

import tempfile
import httpx

with tempfile.NamedTemporaryFile() as download_file:
    url = "https://speed.hetzner.de/100MB.bin"
    with httpx.stream("GET", url) as response:
        print('response', response)
        total = int(response.headers["Content-Length"])
        print('total', total)
        for chunk in response.iter_bytes():
            download_file.write(chunk)
            percent = response.num_bytes_downloaded / total
            print('percent: {:.2%}'.format(percent))

添加代理

httpx 支持通过 proxies 参数设置 HTTP 代理:

with httpx.Client(proxies="http://localhost:8030") as client:
    ...

对于更高级的用例,请传递代理 dict。例如,要将 HTTP 和 HTTPS 请求路由到 2 个不同的代理,分别位于 http://localhost:8030 和 http://localhost:8031,请传递代理 URL:

proxies = {
    "http://": "http://localhost:8030",
    "https://": "http://localhost:8031",
}

with httpx.Client(proxies=proxies) as client:
    ...

代理凭据可以作为代理 URLuserinfo 部分传递:

proxies = {
    "http://": "http://username:password@localhost:8030",
    # ...
}

异步支持

发送异步请求
>>> async with httpx.AsyncClient() as client:
...     r = await client.get('https://www.example.com/')
...
>>> r
<Response [200 OK]>

打开和关闭 Client

使用 with:

async with httpx.AsyncClient() as client:
    ...

显式关闭客户端:

client = httpx.AsyncClient()
...
await client.aclose()

流媒体响应
>>> client = httpx.AsyncClient()
>>> async with client.stream('GET', 'https://www.example.com/') as response:
...     async for chunk in response.aiter_bytes():
...         ...

异步响应流方法有:

  • Response.aread()-用于有条件地读取流块内的响应。
  • Response.aiter_bytes()-用于将响应内容流化为字节。
  • Response.aiter_text()-用于将响应内容流化为文本。
  • Response.aiter_lines()-用于将响应内容流式传输为文本行。
  • Response.aiter_raw()-用于流式传输原始响应字节,无需应用内容解码。
  • Response.aclose()-用于结束回复。您通常不需要这个,因为.stream 块会在退出时自动关闭响应。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

Python异步编程:httpx.AsyncClient的stream方法超时设置全解析 本文深入解析了Python httpx库中AsyncClient.stream()方法的超时设置机制。针对流式请求场景,详细阐述了timeout参数的多维度含义,特别是read超时对数据块间隔的控制作用,并提供了不同业务场景下的配置策略与代码示例,帮助开发者构建稳定高效的异步HTTP流式请求。 阅读详情

相关推荐

httpx,一个网络请求的 Python 新宠儿

一个简单的库,也许能够开启我们的智慧之门, 一个普通的方法,也许能在危急时刻挽救我们于水深火热, 一个新颖的思维方式,也许能激发我们无尽的创造力, 一个独特的技巧,也许能成为我们的隐形盾牌……

小鸿的博客 1618

HTTPX从入门到放弃

HTTPX是一款Python栈HTTP客户端库,它提供了比标准库更高级别、更先进的功能,如连接重用、连接池、超时控制、自动繁衍请求等等。HTTPX同时也支持同步和异步两种方式,因此可以在同步代码和异步代码中通用。HTTPX功能如下:1. 发送HTTP请求:HTTPX支持发送HTTP GET、POST等请求,并提供了丰富的选项进行定制化。2. 请求头和查询参数:HTTPX可以方便地添加请求头和查询参数到HTTP请求中。

所寫即所思|一个阿里质量人对测试的所感所悟。 7171

HTTPX-用于Python的下一代HTTP客户端

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等,UP主更多精彩视频,请关注UP账号。HTTPX 是 Python 3 的一个功能齐全的 HTTP 客户端,它提供同步和异步 API,并支持 HTTP/1.1 和 HTTP/2。2、使用 pip 安装 HTTPX(支持可选的 HTTP/2)(3)HTTP/1.1 和 HTTP/2 的支持。

caixiangting的博客 282

python --httpx异步请求

异步支持 HTTPX默认情况下提供标准的同步API,但是如果需要,还可以为你提供异步客户端的选项 。要发出异步请求,你需要一个httpx.AsyncClient import asyncio import httpx async def main(): async with httpx.AsyncClient() as client: response = await client.get('https://example.org/') loop = asyncio.get

weixin_44634704的博客 3614

eNSP网络构建—建立小型局域网

企业私有网络构建运维 实战案例——使用模拟器构建局域网络 案例分析 1.架构分析 (1)需求分析 本实验的目的在于建立小型局域网。由于公司由不同部门组成,并分布在不同地点,因此需要划分不同网络实现互联互通。设计以下网络:两个部门各使用一台交换机连接,然后连接到总交换机,再通过路由器与外网以及其他部门网络相连。为了控制网络上的广播风暴,增加网络的安全性,在交换机上需要设置VLAN,在路由器与交换机之...

_ 4万+

别再用图片水印了!5种你可能不知道的文本隐写术实战

本文介绍了5种高效的文本隐写术,帮助创作者在不影响内容可读性的情况下嵌入版权信息。从零宽度字符到同形字替换,再到标点符号变形和行尾空格编码,这些技术为数字内容提供了轻量级版权保护方案,特别适用于社交媒体和电子合同等场景。

k8l9m0n的博客 225

HTTPX 项目常见问题解决方案

HTTPX 项目常见问题解决方案 【免费下载链接】httpx A next generation HTTP client for Python. ???? 项目地址: https://gitcode.com/gh_mirrors/ht/...

gitblog_01137的博客 1147

无人机散热系统设计:从材料选择到智能调控的全面解析

本文全面解析无人机散热系统设计,从材料选择到智能调控,探讨了导热界面材料、轻量化散热结构和智能调控算法的应用。通过实战案例,展示了如何在极端环境下优化散热性能,提升无人机的工作效率和可靠性。

weixin_42567279的博客 430

HTTPX:Python 的下一代 HTTP 客户端

HTTPX 继承了 requests 的全部标准功能:Keep-Alive 连接池、Cookie 持久化、SSL 验证、Basic/Digest 认证、代理支持、流式下载、分块请求等。底层传输层用的是 httpcore,SSL 证书来自 certifi,异步库检测来自 sniffio,各组件分工明确。底层传输层用的是 httpcore,SSL 证书来自 certifi,异步库检测来自 sniffio,各组件分工明确。GI 或 ASGI 应用发请求,写测试时不用启动服务器,直接传入应用对象就行。

2601_94989961的博客 266

AutoSAR配置与实践(深入篇)5.4 OS原理(下 )- 内存保护(MPU)

ECU可能由内部模块、第三方模块等各模块集成的。需求对每个模块所定义的安全等级可能有差异,需要考虑不同安全等级的模块和代码间减少相互干扰,防止程序错误传播。可以理解为包含Task、Alarm、Counter、Schedule table、ISRs、Event等基本对象的容器,用于隔离Task/Alarm等,进行内存保护。

nihaoljq2010的博客 3536

DB文件在编程中的作用及示例代码

通过使用DB文件,我们可以实现数据的持久化存储,并能够高效地进行数据的增删改查操作。在本文中,我们以SQLite数据库为例,演示了如何使用Python语言创建和操作DB文件的示例代码。在实际的编程中,我们可以根据具体的需求和使用的数据库系统来进行更复杂的操作和优化。通过使用DB文件,我们可以实现数据的持久化存储,确保数据在程序关闭后也能被保留,并且能够高效地进行数据检索和更新。在本文中,我们将探讨DB文件的作用,并提供一些示例代码展示如何在编程中使用DB文件。上述代码中,我们使用SQLite提供的。

CodeSpark的博客 1821

Python周刊2026W23 | Polars 1.41、PyPy v7.3.23、Python 3.15、httpx2、dj-lite-tenant

本周 Python 生态迎来 Polars 1.41 发布,带来更快的 Parquet 元数据解码等性能优化。PyPy v7.3.23 同步更新。Python 3.15 新增哨兵内置对象。Real Python 带来邮件发送教程、OOP 研讨会及多项实用库介绍,涵盖大规模数据处理、MCP 服务器集成等前沿实践。

业精于勤荒于嬉,行成于思毁于随 251

数字孪生教程大全之 我们如何构建数字孪生?数字孪生的五个级别都是什么

文章摘要 什么是数字孪生? 我们如何构建数字孪生? 开发智能数字孪生系统的框架 什么是数字孪生? 数字孪生是一个不言自明的术语,用于识别物理系统的数字化版本。数字孪生的最早参考来自大卫·格伦特(David Gelernter )的小说作品。在他 1995 年的书中,Gelernter 博士为读者提供了未来有趣的可能性——万维网。前网络书籍谈到了计算机系统上的镜像数字世界。有些人可能会争辩说,我们的 Meta-verse 是新的数字世界——现实世界的数字孪生。但是,还有其他可能性,时间可能会讲述一个更好的

iCloudEnd的博客 3634

Python3: 同时支持 HTTP/2、同步、异步的 HTTP 客户端 HTTPX

httpx 模块时 Python 3 的全功能 HTTP 客户端,它提供了 同步 和 asyncio 异步 API,并支持 HTTP/1.1 和 HTTP/2。它建立在 requests 完善的可用性之上,支持 连接和连接池的保持、Cookie 持久性会话、自动内容解码、Basic/Digest 身份认证、HTTP(S) 代理、分段文件上传、分块请求 等一系列功能。httpx 的 API 布局大部分遵循了 requests,但比后者更强大,是用于 Python 的下一代 HTTP 客户端。

谢TS的博客 6665

【DaVinci Developer工具实战】03 -导入xml文件

本文档描述了 DaVinci Developer 导入数据的的具体功能 ,它适用于导入AUTOSAR SWC 模板【AUTOSAR XML 文件】 文件。

1991

vue2/3 - 详细对接海康监控实时视频预览和录像回放功能,vue接入使用海康视频监控播放器实时推流等功能,支持hik/rtsp/rtmp/hls/ws取流协议(详细教程与示例代码,一键复制开箱即用

vue2,vue3,海康,vue海康视频监控,海康开放平台,如何接入海康的实时监控,海康威视,Vue实现海康监控视频播放,vue3对接海康视频监控播放、回放的方法流程,实现海康H5视频插件播放视频的实例,web网页接入海康,海康威视的视频vue的录像回放和实时预览,前端vue3项目接入海康威视h5player.js播放器,vue2接入海康威视视频监控平台,使用海康监控H5视频播放,对接海康视频监控,海康视频web插件,web前端在vue中通过海康插件嵌入视频,实现实时预览,vue3海康监控播放器组件,vue

✅ 精选推荐文章 1万+

全面指南:HTTPX - 下一代Python HTTP客户端

HTTPX 是一个功能齐全的Python HTTP客户端库,支持同步和异步API,基于标准库的http包构建。它是requests库的现代替代品,添加了对HTTP/2、连接池和异步请求等功能的原生支持。HTTPX 是一个功能强大、现代化的HTTP客户端,适合从简单到复杂的HTTP请求场景。它结合了requests的易用性和现代Python特性,是构建HTTP客户端的绝佳选择。对于新项目,特别是需要异步支持或HTTP/2的项目,强烈建议考虑使用HTTPX而不是较老的requests库。

2127

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

HTTPX:Python下一代HTTP客户端库全面解析

HTTPX:Python下一代HTTP客户端库全面解析 【免费下载链接】httpx A next generation HTTP client for Python. ???? 项目地址: https://gitcode.com/gh_...

gitblog_00277的博客 603

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python 的下一代 HTTP 客户端 HTTPX 特性详解

支持 HTTP Basic Auth 和 Digest Auth。HTTPX = requests 的易用性 + 异步 + HTTP/2 + 类型安全 + 现代架构。无论是写脚本、做测试、还是构建高性能服务,它都是目前 Python 最先进的 HTTP 客户端之一。

SunnyRivers 1083

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HTTPX:Python 下一代 HTTP 客户端

100% 的测试覆盖率;requests 的 API 设计在 Python 社区深入人心,HTTPX 选择继承这一设计,同时补上协议和并发方面的能力缺口。社区生态方面,不少主流 Python 项目已将 HTTPX 作为默认 HTTP 客户端,FastAPI 的测试客户端、某些异步爬虫框架都建立在 HTTPX 之上。对于新项目,如果你需要 HTTP/2 或异步支持,HTTPX 是一个值得考虑的选项。这些功能覆盖了日常开发的大部分需求,从简单的 GET 请求到复杂的文件上传、认证和流式处理都能应对。

matrixmind8的博客 427

深入理解HTTPX:Python下一代HTTP客户端库

深入理解HTTPX:Python下一代HTTP客户端库 【免费下载链接】httpx A next generation HTTP client for Python. ???? 项目地址: https://gitcode.com/gh_...

gitblog_00464的博客 522

python-httpx的使用

HTTPX是Python3的功能齐全的HTTP客户端,它提供同步和异步API,并支持HTTP/1.1和HTTP/2 安装 pip install httpx 创建请求 通过httpx库发出一个请求非常简单,如下: import httpx response = httpx.get('https://www.baidu.com/') print(type(response), response) # <class 'httpx.Response'> <Response [200

奔跑的豆子的专栏 1万+
上一篇: Python工厂模式封装Webhook群聊机器人
下一篇: 400页Python学习PDF笔记,全面总结零基础入门看这一篇足够了
大模型产品经理
博客等级 码龄3年 1万+粉丝 1120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值