python 使用 httpx 发送http2.0 请求
python 使用 httpx 发送http2.0 请求
- 摘要
- 安装
- http/2 支持
- 客户端请求
- 更有效地利用网络资源
- 额外功能
- 同步
- 异步
- 复杂示例,APNS异步推送到多用户
- http/1 支持
- 简单请求
- 携带参数,文件,自定义请求头
- 同步
- 异步
- 总结
摘要
python
中最早支持HTTP/2
的是hyper,但这个库近几年都不更新了。最近这批开发人员又出了一个新库,用来支持HTTP/2
,hyper-h2,这个库看提交时间是最近才开始开发的,不过目前看来还没有支持异步的计划。
这里,我要介绍的是另一个HTTP/2
的库httpx
,也是新开发的,准确的来说还是beta
版本。同时支持HTTP/1.1
和HTTP/2
。而且还支持发送异步请求。就笔者写这篇文章的时候,这个项目的star
已经有5.3k
了。
httpx
官方文档地址,如果觉得笔者啰嗦,可以直接阅读官方文档,下面文章只是一篇简单的教程。
安装
# 只支持 python3.6 以上版本
pip install httpx
http/2 支持
客户端请求
更有效地利用网络资源
当您使用《快速入门》指南中记录的顶级API进行请求时,HTTPX必须为每个单个请求建立一个新的连接(连接不会被重用)。随着对主机的请求数量增加,这很快变得效率低下。
另一方面,Client实例使用HTTP连接池。这意味着当您向同一主机发出多个请求时,它们Client将重用基础的TCP连接,而不是为每个单个请求重新创建一个。
与使用顶级API相比,这可以带来显着的性能改进,包括:
- 减少了请求之间的延迟(无握手)。
- 减少CPU使用率和往返次数。
- 减少网络拥塞。
额外功能
Client 实例还支持顶级API所不具备的功能,例如:
- Cookie跨请求的持久性。
- 在所有传出请求中应用配置。
- 通过HTTP代理发送请求。
- 使用HTTP / 2。
一般建议:建议使用a Client作为上下文管理器。这将确保离开with模块时正确清理连接:
同步
>>> headers = {'X-Auth': 'from-client'}
>>> params = {'client_id': 'client1'}
>>> with httpx.Client(headers=headers, params=params, http2=True) as client:# with 内部请求共用一个client,参数也共用# 替换client的参数
... headers = {'X-Custom': 'from-request'}
... params = {'request_id': 'request1'}
... r = client.get('https://example.com', headers=headers, params=params)
异步
async with httpx.AsyncClient(http2=True) as client:...
复杂示例,APNS异步推送到多用户
可参考完整实现代码
import httpx
import asyncioasync def http2conn(device_token, client, content):r = await client.post(f"/3/device/{device_token}", json=content)logger.info('ios push: ' + device_token)logger.info(r.status_code)# 您可以参考apple apns官方文档,重组下面的推送参数
# 此函数可以在协程中直接调用
async def ios_push(title, text, product, product_id, device_tokens='', **kwargs):"""kwargs={'product':'', 'product_id': '产品id', 'device_token': 'device_token'}"""content = {"aps": {"alert": {"title": title,"body": text,},},"classify": product,"carousel_id": product_id,}path = 'dev_certificates.pem'device_tokens = device_tokens.split(',')number = len(device_tokens) // 1000async with httpx.AsyncClient(base_url=settings.IOS_URL, cert=path, http2=True) as client:http2conn_def = partial(http2conn, client=client, content=content)for i in range(number + 1):limit = i * 1000await asyncio.gather(*[http2conn_def(device_token) for device_token in device_tokens[limit:limit + 1000]])
http/1 支持
简单请求
>>> r = httpx.get('https://httpbin.org/get')
>>>> r = httpx.post('https://httpbin.org/post', data={'key': 'value'})
>>> r = httpx.put('https://httpbin.org/put', data={'key': 'value'})
>>> r = httpx.delete('https://httpbin.org/delete')
>>> r = httpx.head('https://httpbin.org/get')
>>> r = httpx.options('https://httpbin.org/get')
携带参数,文件,自定义请求头
>>> files = {'upload-file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel')}
>>>> headers = {'user-agent': 'my-app/0.0.1'}
>>> cookies = {"peanut": "butter"}
>>> r = httpx.post('https://httpbin.org/post', data={'key': 'value'}, headers=headers, files=files, cookies=cookies)>>> r.headers
Headers({'content-encoding': 'gzip','transfer-encoding': 'chunked','connection': 'close','server': 'nginx/1.0.4','x-runtime': '148ms','etag': '"e1ca502697e5c9317743dc078f67693f"','content-type': 'application/json'
})
>>> r.status_code
同步
>>> headers = {'X-Auth': 'from-client'}
>>> params = {'client_id': 'client1'}
>>> proxies = {... "http": "http://127.0.0.1:3080",
... "https": "http://127.0.0.1:3081"
... }
>>> with httpx.Client(headers=headers, params=params, proxies=proxies) as client:
... headers = {'X-Custom': 'from-request'}
... params = {'request_id': 'request1'}
... r = client.get('https://example.com', headers=headers, params=params)
异步
HTTPX
默认情况下提供标准的同步API,但是如果需要,还可以为您提供异步客户端的选项。
异步是一种并发模型,其效率远远高于多线程,并且可以提供显着的性能优势并支持使用长期存在的网络连接(例如WebSockets
)。
import asyncio
import httpxasync def main():async with httpx.AsyncClient() as client:response = await client.get('https://www.example.com/')print(response)asyncio.run(main())
总结
http/1
和 http/2
的API基本一致,可参靠上述实现http/1
,另外http/2
只支持客户端方式请求。
这里只是简单的介绍,如需要复杂的功能(流式传输,代理请求,SSL
证书,.netrc
支持等)还是仔细研读官方文档以及源码。
python 使用 httpx 发送http2.0 请求相关推荐
- internetreadfile读取数据长度为0_Go发起HTTP2.0请求流程分析(后篇)——标头压缩
阅读建议 这是HTTP2.0系列的最后一篇,笔者推荐阅读顺序如下: Go中的HTTP请求之--HTTP1.1请求流程分析 Go发起HTTP2.0请求流程分析(前篇) Go发起HTTP2.0请求流程分析 ...
- python-httpx 发送http2.0时代请求
在日常开发中,经常会发送各种各样的网络请求.Python中常用的网络请求库有requests.aiohttp.httpx等,httpx是基于Python3的新一代的网络请求库,它的功能很丰富,做个简答 ...
- python同时同步发送多个请求_python如何实现“发送一个请求,等待多个响应”的同步?...
我正在写一些代码通过串行口与单片机通信. MCU端基本上是一个请求/响应服务器. 一个或多个MCU发送我的请求. 然而,响应可以异步到达并且具有随机延迟,但是响应的顺序将保持不变. 另外,我的应用程序 ...
- android http2.0请求,Android http HttpURLConnection
/** * Http get 请求 * * @param urlPath * * */ private static String httpConnByGet(RequestUrl ru,Params ...
- python写页面发送post请求_Python模拟浏览器向CSDN发送post请求的方法,POST
目录 1.发送get请求的方法 import requests import json def GET(url): #get请求 req = requests.get(url) #输出状态码 prin ...
- python requests是什么_如何基于Python + requests实现发送HTTP请求
这篇文章主要介绍了如何基于Python + requests实现发送HTTP请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.在接口自动化测试 ...
- Python 使用 Scrapy 发送 post 请求的坑
From:https://www.jb51.net/article/146769.htm 使用 requests 发送 post 请求 先来看看使用requests来发送post请求是多少好用,发送请 ...
- python发送HTTP POST请求
1. 127.0.0.1和0.0.0.0 127.0.0.1是一个回送地址,指本地机,一般用来本机测试使用,使用127.0.0.1启的服务只能在本地机器上访问,使用0.0.0.0启的服务可以在其他机器 ...
- python使用urllib发送post请求_python使用urllib2提交http post请求的方法
Python模拟新浪微博登录 看到一篇Python模拟新浪微博登录的文章,想熟悉一下其中实现方式,并且顺便掌握python相关知识点. 代码 下面的代码是来自上面这篇文章,并稍作修改添加了一些注释. ...
最新文章
- 用户及用户组管理(week1_day4)--技术流ken
- Surviving the Release Version
- GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机
- linux下q和q 的区别,linux命令中q、wq、q!的区别
- 采用python解决实际问题_Python编程语言解决几种常见的实际问题
- log4j的使用 ideal java 114812280
- 【PostgreSQL-9.6.3】使用pg_settings表查看参数的生效条件
- DML、DDL的概念与区别
- 卸载不了mysql2008_卸载SQL2008遇到的问题及解决办法
- 网页版 Facebook 第三方登录示例 Facebook网页登录
- Win:从 Microsoft官方网站下载官方正版ISO镜像文件(以Windows10为例,图文教程)
- iPad、iPhone 关闭WiFi私有地址 | 设置手动DNS |以iPhone为例
- 敏捷项目管理传统项目管理的区别
- 检测屏幕.html,15款html5响应式网站跨屏幕测试工具
- 血泪踩坑:没有官方开发版MIUI如何给手机刷机?
- 秉火429笔记之五控制RGB彩灯
- js 延迟几秒执行ifarme_延时加载JavaScript代码提高速度_javascript技巧 -
- vim编辑器中cscope自动加载cscope.out文件的方法
- 基于java+jsp的酒店预订系统
- Eclipse 简介和插件开发天气预报
热门文章
- 谷歌公司推荐的计算机科学在线课程学习路线
- Docker | 入门
- 关于Aurix的内存,缓存Cache,PSPR等的理解-(持续更新)
- 逆向工程师逆向还原APP和代码,国产化就是这样
- macOS查看快捷键
- 单缝衍射matlab,基于matlab的单缝衍射.doc
- 建立远程桌面连接计算机无密码,如何用空密码登录远程桌面/远程桌面连接的设置,来学习吧...
- unity时间暂停动画不受影响
- check the manual that corresponds to your MySQL server version for the right syntax to use完美解决
- Linux云计算学习笔记day52