使用request 库模拟发送 HTTPS 请求和 WebSocket 请求

1,410 阅读3分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第21篇文章,点击查看活动详情


发送HTTPS请求

随着对安全性的要求越来越高,HTTP渐渐被HTTPS所取代,而requests的库也在不断地完

善,最新的requests模块中自带了一个certifi包,requests会试图使用它里边的证书。这样用户就可以在不修改代码的情况下更新它们的可信任证书。certifi模块如图所示。

image.png

不需要修改请求的代码,只需要将URL替换成HTTPS,就可以发送HTTPS的请求了。

实例代码:

1 import requests

2 headers ={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64)Applewebkit/537.36 (KHTML, like Gecko)Chrome/55.0.2883.87 Safari/537.36")

3 test_url="https://www.zhihu.com/" 

4 r=requests.get(test_url,headers=headers)

5 print(r.status_code)

6 print (r.headers)

7 print(r.text)

运行结果如图所示

image.png

当然也会遇到一些特有的证书不在certifi包中,这时候就需要先通过浏览器找到需要的证书名称,然后通过浏览器设置中的证书选项导出对应的证书和密钥,加上一个cert参数指定证书和密钥的路径就可以了。

image.png

发送 WebSocket 请求

之前介绍的requests模块是基于HTTP协议的,所以如果要发送WebSocket 请求就需要安装 第三方的WebSocket模块。

通过 pip安装就可以了。

pip install websocket

pip install websocket-client

然后同理导入该模块就可以使用WebSocket模块的功能发送请求了。 import websocket

后面会通过实例来介绍 WebSocket的具体使用方法。

请求与响应

WebSocket 语法也是相当简单的,先发送一个WebSocket的请求连接,通道连接成功之后可 以发送消息,也可接受消息。语法格式如下:

变量=websocket.create_connection(ur1)

建立连接,只不过此时的URL不是以HTTP开头的,而是以ws开头的。

变量.send(发送内容)

发送带内容的消息,可以是字符串,也可以是列表字典,具体需要看服务器端接收什么数据。

变量.recv()

接收服务器发送的消息,这个区别于HTTP的response的地方在于:接收消息是没有超时机 制的。也就是说一旦建立连接通道之后,就会一直处于等待待命状态,直到接收到数据才会关闭 recv0方法,但如果要一直接收数据,则需要通过循环执行recv(方法,当收到一条消息时,关闭 recv0结束一次循环。之后会在自动化测试中讲到循环结构,这里先不做介绍了。

所以WebSocket 相对HTTP还是简单很多,建立连接,然后发送消息和接收消息

请求实例

通过一个实例来介绍WebSocket吧,这是一个聊天室系统,就是通过WebSocket实现的发送 消息和接收消息,而需要测试的就是发送消息和接受消息是否成功。

实例代码:

1 import websocket

2 ur1="ws://www.xxxx.com/xxxx" 

3 ws=websocket.create_connection(ur1)

4 ws.send("{"request":1111,"service":1001,"name":"xxxx"}") 

5 new_msg=ws.recv()

6print (new_msg)

7 ws.send("{"request":"1111, "service":1003, "name":"x", "message":"1111111"}")

8 new_msg1=ws.recv()

9 print (new_msg1)

代码说明:

3 使用WebSocket的create_connection 方法向聊天室的URL发起连接,并赋值给变量SM

4 连接完成之后通过sendO方法发送请求的内容,即登录所需要的信息。

5 将服务器返回的内容赋值给new_msg,即登录成功/失败的返回信息,一般正常情况都是成功的。

7 再次通过sendO方法,发送聊天室内容“a”到服务器。

8 将服务器返回的内容赋值给 new_msg1,即发送消息成功/失败的返回信息,一般也是会成功的。

运行结果如图所示。

image.png