requests库是用来发送请求的库,本篇用来讲解requests库的基本使用。
1.安装requests库
pip install requests
2.requests库底层方法的调用逻辑
(1)get / post / put / delete 四种方法底层调用 request方法
注意:data和json都可以作为Post请求的参数,但是使用时机不同。当传参是json类型时,使用json,当传参是文件时使用files,其他时候使用data。
(2)request方法底层调用session.request方法
(3)因为get / post / put / delete 四种方法不能对有cookie关联的接口进行自动关联,而session.request方法可以进行自动管理,所以常用session.request方法发送请求。
3.session.request方法的参数,常用的有:
参数 | 说明 |
---|---|
method | 请求方法 |
url | 请求路径 |
params=None | get请求传参 |
data=None | post或put请求传参 |
json=None | post请求传参 |
headers=None | 请求头 |
cookies=None | Cookie |
files=None | 文件上传 |
4.接收响应
session.request方法发送请求后会返回响应,接收响应时需要根据响应的类型来接收:
接收方式 | 说明 |
---|---|
res.text | 返回文本信息 |
res.json() | 返回json格式 |
res.content | 返回的字节内容 |
res.status_code | 返回的状态码 |
res.reason | 返回的状态信息 |
res.cookies | 返回的coolie |
res.encoding | 返回的编码格式 |
res.headers | 返回的响应头 |
5.接口关联
当后一个接口的参数需要从前一个接口的响应数据中获取时,就需要进行接口关联。
实现接口关联有三种方式:
- 通过类变量保存中间变量
- 通过单独文件保存中间变量
- 极限封装成工具一样,只需要通过表达式
首先说明如何通过类变量保存中间变量?
只需要从前一个接口中提取到变量设置为类变量,就可以通过类名在第二个接口中调用了。
class Testapi:
access_token = ""
而从响应中提取变量有两种方式:
- 正则表达式提取(适用于提取文本结果)
- JsonPath提取 (适用于提取json结果)
正则表达式提取变量的方法有两种:
- re.search() 提取单个值,通过下标取值
- re.findall() 提取多个值,通过下标取值
re.search(表达式,对象)
result = res.text
Testapi.access_token = re.search('xxx(.*?)xxx',result).group(1)
JsonPath提取变量只有一个方法:
jsonpath.jsonpath(对象,表达式)
result = res.json()
value = jsonpath.jsonpath(result,”$.access_token”)
jsonPath表达式规则:
规则 | 解释 |
---|---|
$ | 根节点 |
. | 子节点 |
… | 递归取子节点 |
[] | 代表取列表中的值,下标从0开始 |
6.统一的请求封装
请求四要素:请求方法、请求路径、请求参数、请求头
响应四要素:响应码、响应信息、响应内容、响应头
所有请求的发送都是组织请求四要素然后发送,这种相同类型的操作可以进行统一的封装,减少冗余代码,同时可以对请求进行统一管理,如统一异常处理,统一日志监控。
在统一封装请求时,可以直接将参数传递给session.request()方法的可变长度参数,就不需要考虑参数的类型了。
# 封装
class RequestUtils:
sess = requests.session();
# 统一发送请求
def all_send_request(self,**kwargs):
res = RequestUtils.sess.request(**kwargs)
print(kwargs["method"])#获取请求方式
return res
class Testapi:
# 调用
def test_file_upload(self):
url=""
datas={"meida":open("E:\\111.png","rb")} # 文件的字节流
res = RequestUtils().all_send_request(method="post",url=url,files=datas)
封装之后会发现第一种通过类变量保存中间变量,在跨文件使用时会导致用例出错。
为了解决这个问题,我们可以使用第二种方法:通过单独的文件保存中间变量,来实现接口关联。