百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

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

liuian 2025-02-11 12:40 39 浏览

前言

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

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

安装

使用 pip 安装 httpx:

pip install httpx

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

pip install 'httpx[cli]'

命令行测试发送请求:

快速入门

发起 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'\n\n\nExample Domain...'

添加 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
[]

高级用法

使用 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

跨请求共享配置

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

打开和关闭 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 块会在退出时自动关闭响应。

相关推荐

搭建一个20人的办公网络(适用于20多人的小型办公网络环境)

楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...

笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)

1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...

汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)

使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...

xpsp3安装版系统下载(windowsxpsp3安装教程)

xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...

没有备份的手机数据怎么恢复

手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。  2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。  3、...

电脑怎么激活windows11专业版

win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...

华为手机助手下载官网(华为手机助手app下载专区)

华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...

光纤线断了怎么接(宽带光纤线断了怎么接)

宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...

深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
win7旗舰版和专业版区别(win7旗舰版跟专业版)

1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...

万能连接钥匙(万能wifi连接钥匙下载)

1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...

雨林木风音乐叫什么(雨林木风是啥)

雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...

aics6序列号永久序列号(aics6破解序列号)

关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...

win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)

答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...