点击上方“中兴开发者社区”,关注我们
每天读一篇一线开发者原创好文
问题引入:项目发展,自动化测试需要使用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.
拓展阅读: