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

时间:2024-03-13 14:43:02

点击上方“中兴开发者社区”,关注我们

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

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

问题引入:项目发展,自动化测试需要使用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请求?