python 使用 httpx 发送http2.0 请求

  • 摘要
  • 安装
  • http/2 支持
    • 客户端请求
      • 更有效地利用网络资源
      • 额外功能
    • 同步
    • 异步
    • 复杂示例,APNS异步推送到多用户
  • http/1 支持
    • 简单请求
    • 携带参数,文件,自定义请求头
    • 同步
    • 异步
  • 总结

摘要

python中最早支持HTTP/2的是hyper,但这个库近几年都不更新了。最近这批开发人员又出了一个新库,用来支持HTTP/2,hyper-h2,这个库看提交时间是最近才开始开发的,不过目前看来还没有支持异步的计划。

这里,我要介绍的是另一个HTTP/2的库httpx,也是新开发的,准确的来说还是beta版本。同时支持HTTP/1.1HTTP/2。而且还支持发送异步请求。就笔者写这篇文章的时候,这个项目的star已经有5.3k了。
httpx官方文档地址,如果觉得笔者啰嗦,可以直接阅读官方文档,下面文章只是一篇简单的教程。

安装

# 只支持 python3.6 以上版本
pip install httpx

http/2 支持

客户端请求

更有效地利用网络资源

当您使用《快速入门》指南中记录的顶级API进行请求时,HTTPX必须为每个单个请求建立一个新的连接(连接不会被重用)。随着对主机的请求数量增加,这很快变得效率低下。

另一方面,Client实例使用HTTP连接池。这意味着当您向同一主机发出多个请求时,它们Client将重用基础的TCP连接,而不是为每个单个请求重新创建一个。

与使用顶级API相比,这可以带来显着的性能改进,包括:

  1. 减少了请求之间的延迟(无握手)。
  2. 减少CPU使用率和往返次数。
  3. 减少网络拥塞。
额外功能

Client 实例还支持顶级API所不具备的功能,例如:

  1. Cookie跨请求的持久性。
  2. 在所有传出请求中应用配置。
  3. 通过HTTP代理发送请求。
  4. 使用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/1http/2 的API基本一致,可参靠上述实现http/1,另外http/2只支持客户端方式请求。
这里只是简单的介绍,如需要复杂的功能(流式传输,代理请求,SSL证书,.netrc支持等)还是仔细研读官方文档以及源码。

python 使用 httpx 发送http2.0 请求相关推荐

  1. internetreadfile读取数据长度为0_Go发起HTTP2.0请求流程分析(后篇)——标头压缩

    阅读建议 这是HTTP2.0系列的最后一篇,笔者推荐阅读顺序如下: Go中的HTTP请求之--HTTP1.1请求流程分析 Go发起HTTP2.0请求流程分析(前篇) Go发起HTTP2.0请求流程分析 ...

  2. python-httpx 发送http2.0时代请求

    在日常开发中,经常会发送各种各样的网络请求.Python中常用的网络请求库有requests.aiohttp.httpx等,httpx是基于Python3的新一代的网络请求库,它的功能很丰富,做个简答 ...

  3. python同时同步发送多个请求_python如何实现“发送一个请求,等待多个响应”的同步?...

    我正在写一些代码通过串行口与单片机通信. MCU端基本上是一个请求/响应服务器. 一个或多个MCU发送我的请求. 然而,响应可以异步到达并且具有随机延迟,但是响应的顺序将保持不变. 另外,我的应用程序 ...

  4. android http2.0请求,Android http HttpURLConnection

    /** * Http get 请求 * * @param urlPath * * */ private static String httpConnByGet(RequestUrl ru,Params ...

  5. python写页面发送post请求_Python模拟浏览器向CSDN发送post请求的方法,POST

    目录 1.发送get请求的方法 import requests import json def GET(url): #get请求 req = requests.get(url) #输出状态码 prin ...

  6. python requests是什么_如何基于Python + requests实现发送HTTP请求

    这篇文章主要介绍了如何基于Python + requests实现发送HTTP请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.在接口自动化测试 ...

  7. Python 使用 Scrapy 发送 post 请求的坑

    From:https://www.jb51.net/article/146769.htm 使用 requests 发送 post 请求 先来看看使用requests来发送post请求是多少好用,发送请 ...

  8. python发送HTTP POST请求

    1. 127.0.0.1和0.0.0.0 127.0.0.1是一个回送地址,指本地机,一般用来本机测试使用,使用127.0.0.1启的服务只能在本地机器上访问,使用0.0.0.0启的服务可以在其他机器 ...

  9. python使用urllib发送post请求_python使用urllib2提交http post请求的方法

    Python模拟新浪微博登录 看到一篇Python模拟新浪微博登录的文章,想熟悉一下其中实现方式,并且顺便掌握python相关知识点. 代码 下面的代码是来自上面这篇文章,并稍作修改添加了一些注释. ...

最新文章

  1. 用户及用户组管理(week1_day4)--技术流ken
  2. Surviving the Release Version
  3. GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机
  4. linux下q和q 的区别,linux命令中q、wq、q!的区别
  5. 采用python解决实际问题_Python编程语言解决几种常见的实际问题
  6. log4j的使用 ideal java 114812280
  7. 【PostgreSQL-9.6.3】使用pg_settings表查看参数的生效条件
  8. DML、DDL的概念与区别
  9. 卸载不了mysql2008_卸载SQL2008遇到的问题及解决办法
  10. 网页版 Facebook 第三方登录示例 Facebook网页登录
  11. Win:从 Microsoft官方网站下载官方正版ISO镜像文件(以Windows10为例,图文教程)
  12. iPad、iPhone 关闭WiFi私有地址 | 设置手动DNS |以iPhone为例
  13. 敏捷项目管理传统项目管理的区别
  14. 检测屏幕.html,15款html5响应式网站跨屏幕测试工具
  15. 血泪踩坑:没有官方开发版MIUI如何给手机刷机?
  16. 秉火429笔记之五控制RGB彩灯
  17. js 延迟几秒执行ifarme_延时加载JavaScript代码提高速度_javascript技巧 -
  18. vim编辑器中cscope自动加载cscope.out文件的方法
  19. 基于java+jsp的酒店预订系统
  20. Eclipse 简介和插件开发天气预报

热门文章

  1. 谷歌公司推荐的计算机科学在线课程学习路线
  2. Docker | 入门
  3. 关于Aurix的内存,缓存Cache,PSPR等的理解-(持续更新)
  4. 逆向工程师逆向还原APP和代码,国产化就是这样
  5. macOS查看快捷键
  6. 单缝衍射matlab,基于matlab的单缝衍射.doc
  7. 建立远程桌面连接计算机无密码,如何用空密码登录远程桌面/远程桌面连接的设置,来学习吧...
  8. unity时间暂停动画不受影响
  9. check the manual that corresponds to your MySQL server version for the right syntax to use完美解决
  10. Linux云计算学习笔记day52