搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > 中兴开发者社区 > 干货 | 如何使用Python模拟客户端发送http2.0请求?

干货 | 如何使用Python模拟客户端发送http2.0请求?

中兴开发者社区 2019-02-12
举报

每天读一篇一线开发者原创好文

问题引入:项目发展,自动化测试需要使用python模拟客户端发送http2.0请求。

选型:目前网上盛行的python模拟客户端发送http2.0的库主要为hyper,毫无疑问,大胆一试。选型参考:https://github.com/http2/http2-spec/wiki/Implementations


如何安装hyper?!

说明:HTTP/2协议只使用在加密的https端口,规范要求非常新的TLS支持。  对于较早版本的Python(例如Python2.7.5),我们使用PyOpenSSL来提供我们所需的TLS支持,而PyOpenSSL需要cryptography等标准库,安装着实不便。当使用Python 3.4及更高版本时,这由标准库自动提供。本文以Python2.7.13版本安装hyper为例。


1、在线安装hyper

1)可以使用pip安装hyper

     $pip install hyper

2)若python版本较老,无pip命令,可以使用easy_install安装hyper

      $easy_install hyper


2、离线安装hyper

     若在线安装hyper失败,可以登录github(https://github.com/Lukasa/hyper/tree/master)下载hyper库,离线安装

     $python setup.py install


如何使用hyper发送http2.0请求?

举两个小栗子以说明:1、发送http2.0请求到需要服务端认证的443端口;2、发送http2.0请求到需要服务端证书认证和客户端证书认证的443端口;

1、发送http2.0请求到需要服务端认证的服务

  >>>c=HTTPConnection('10.10.10.231',port=443,secure=True,ssl_context=tls.init_context(cert_path='/home/ubuntu/certs/ca.crt')

  >>> c.request('GET', '/api/aa/v1/testtcp/helloworld')


2、发送http2.0请求到需要服务端认证和客户端认证的服务

  >>>c=HTTPConnection('10.10.10.231',port=443,secure=True,ssl_context=tls.init_context(cert_path='/home/ubuntu/certs/ca.crt',cert=('/home/ubuntu/certs/client.crt','/home/ubuntu/certs/client.key')))

  >>> c.request('GET', '/api/bb/v1/testtcp/helloworld')



hyper如何兼容发送http1请求?

如下所示举两个小栗子以说明:1、发送http请求到服务不需认证的80端口;2、发送https请求到需要服务端证书认证的443端口;

1、发送http请求到服务不需认证的80端口

  >>>c=HTTPConnection('10.10.10.231',port=80)

  >>>c.request('GET', '/api/aa/v1/testtcp/helloworld',)

2、发送https请求到需要服务端证书认证的443端口

 >>>c=HTTPConnection('10.10.10.231',port=443,secure=True,ssl_context=tls.init_context(cert_path='/home/ubuntu/certs/ca.crt')

  >>> c.request('GET', '/api/aa/v1/testtcp/helloworld')


注:HTTP/2采用多路复用方式,一个连接被分为多个流(stream),每个流都有自己的请求-响应对。在hyper中,在如上所示,当发送请求c.request时,请求返回stream id时(如上所示的“1”),则表示当前使用http2.0发送请求;若c.request无stream id返回值时,则表示使用http1.0发送请求。当发送https请求,即连接需要认证时,secure=True,ssl_context为证书设置;当发送http请求时,secure=False。ssl_context=tls.init_context(cert_path=None, cert=None, cert_password=None),ssl_context参数包括cert_path、cert、cert_password,可以默认不填。ssl_context的cert_path为服务端证书路径,cert为客户的证书路径。当cert_path=None, cert=None默认使用hyper证书。

引:想了解关于hyper库的更多详情,请参考:http://hyper.readthedocs.io/en/latest/quickstart.html.


拓展阅读:


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《干货 | 如何使用Python模拟客户端发送http2.0请求?》的版权归原作者「中兴开发者社区」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

举报