Requests 是一个优雅而简单的 Python HTTP 库,其实 Python 内置了用于访问网络的资源模块,比如urllib,但是它远不如 Requests 简单优雅,而且缺少了许多实用功能。所以,更推荐掌握 Requests 做接口测试,这也是互联网大厂流行的接口测试利器。
Requests 官方文档:
https://2.python-requests.org/en/master/
Requests 提供了几乎所有的 HTTP 请求构造方法,以及通过传入参数的方法,对发送的请求进行定制化的配置,可以用来应对各种不同的请求场景。
安装:pip install requests
一、HTTP请求构造
发送get请求
import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get('https://mall.jctesting.cn/pc/',verify=False)
result = response.text
print(result)
1、verify=False 忽略https请求的SSL验证(SSL证书是由CA机构颁发的),urllib3.disable_warnings( )主要用于去除Requests 会抛出 SSLError;
2、response为一个对象:
3、通过调用该对象的text返回一个str类型HTML格式的响应结果
响应结果:
Loading...
发送一个带参数的get请求
import requests
params = {"name":"小米"}
response = requests.get('https://mall.jctesting.cn/api/pc/goodsList',params=params,verify=False)
print(type(response))
result = response.text
res_url = response.url
print(res_url)
response.url返回请求的完整Url:
https://mall.jctesting.cn/api/pc/goodsList?page_size=20&name=古
等价于
response = requests.get('https://mall.jctesting.cn/api/pc/goodsList?page_size=20&name=小米',verify=False)
响应内容介绍
response.encoding #获取当前的编码
response.encoding = 'utf-8' #设置编码
response.text #以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
response.content #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
response.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
response.status_code #响应状态码
response.json() #Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
response.raise_for_status() #失败请求(非200响应)抛出异常
response = requests.get('https://mall.jctesting.cn/pc/goods_list?name=小米',verify=False)
print("当前编码:",response.encoding) # 获取当前编码
print("字符串方式的响应体:",response.text) # 以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
print("服务器返回的响应头:",response.headers) # 以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
print("响应状态码:",response.status_code) # 响应状态码
print("json格式的响应体:",response.json()) # Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
发送POST请求
通过调用mall.jctesting.cn商城的登录接口完成登录
api_url = "https://mall.jctesting.cn/api/account/login"
datas = {
"account": "15200000001",
"password": "111111.",
"client": 5
}
response = requests.post(url=api_url,data=datas,verify=False) # verify=False忽略ssl安全证书检验
print(response.json())
响应结果
{'code': 1, 'msg': '登录成功', 'data': {'id': 156, 'nickname': 'Jie', 'avatar': 'http://jc-mall1.oss-cn-shanghai.aliyuncs.com/uploads/images/2021052712154909b870403.png', 'level': 0, 'disable': 0, 'distribution_code': '7TZH6Z', 'token': '2b7e386c330c2bfdd88fc0565221a205'}, 'show': 0, 'time': '0.059077'}
在通过requests.post()进行POST请求时,传入报文的可选参数有两个,一个是data,一个是json;常见的form表单可以直接使用data参数进行报文提交,而data的对象则是python中的字典类型;当然现在更多接口,提交参数时需要以json格式提交,这个时候需要把字典形式的参数传递给json,requests内部会对字典类型的对象转换为json格式;
构造headers请求头
/api/cart/add 是mall.jctesting.cn商城的加入购物车接口
参数:
api_url = "https://mall.jctesting.cn/api/cart/add"
datas = {"item_id":4,"goods_num":1}
headers ={"token":"4abedc4a91674112b175fd2739f1fce3"}
r = requests.post(url=api_url, data=datas, headers=headers, verify=False)
r.json()
结果:
{'code': 1, 'msg': '加入成功', 'data': [], 'show': 0, 'time': '0.046635'}
headers参数接收一个字典类型的对象,构造请求头时构造一个字典对象传给headers参数
timeout参数
设定超时时间(秒),到达这个时间之后会停止等待响应
api_url = "https://mall.jctesting.cn/api/cart/add"
datas = {"item_id":4,"goods_num":1}
headers ={"token":"4abedc4a91674112b175fd2739f1fce3"}
r = requests.post(url=api_url, data=datas, headers=headers,timeout=0.001,verify=False)
r.json()
结果:
requests.exceptions.ProxyError: HTTPSConnectionPool(host='mall.jctesting.cn', port=443): Max retries exceeded with url: /api/cart/add (Caused by ProxyError('Cannot connect to proxy.', timeout('timed out')))
文件上传
使用Requests模块,进行上传文件可通过files参数来定义,注:上传的files需要是二进制模式读取即'rb'模式
import requests
files = {'file':open('userId.txt', 'rb')}
response = requests.post(url, files=files)
print(response.text)