如何使用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.

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180320B16GUK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券