import ast
from jsonpath import jsonpath
from api.tools.handle_attribute import HandleAttr
"""
核心功能:
鉴权
参数依赖提取
设置全局变量(设置类属性)
"""
class HandleExtract:
"""
思路:
1、在excel中新增extract_data,用于存储提取数据的key以及提取表达式(jsonpath)
2、在请求需要鉴权的接口之前,去请求登录接口,读取extract_data中的数据,获取字典的key(响应结果中key),values(json)
从响应结果中提取到鉴权信息,设置到类属性作为全局变量
3、如果是鉴权,就在请求需要鉴权的接口之前,将这个鉴权的token设置到请求头里面
4、如果是参数依赖,其他接口在发送请求之前,去获取到相应的参数,替换自己的请求参数
"""
# extract_data {"access_token":"$..access_token"}
# {'response_type': 'json', 'response': {'access_token': '383be57e-3c93-45ee-a0ee-80d3ae10a218', 'token_type': 'bearer', 'refresh_token': '2ff76de6-0f6f-48d3-96be-4f9444a8fac5', 'expires_in': 1295999}
def handle_extract(self, extract_data, response):
"""
:param extract_data (str): 字符串类型,取数来源读取excel
:param response (dict): 字典类型,取数来源接口返回
:return:
"""
if extract_data:
# 三元运算,判断extract_data请求类型 ast.literal_eval将字符串转换为dict
extract_data = extract_data if isinstance(extract_data, dict) else ast.literal_eval(extract_data)
# items():获取所有的键值对,每个键值对是元祖形式
for key, value in extract_data.items(): # access_token $..access_token
# 通过jsonpath将响应结果中的token提取出来
token = jsonpath(response, value)[0]
# 将提取到的access_token属性设置为全局变量
setattr(HandleAttr, key, token)
# 读取全局变量的属性值
print("获取的token:", getattr(HandleAttr, key))
else:
print("extract_data:数据为空,无需设置全局变量")
if __name__ == '__main__':
extract_data = '{"access_token":"$..access_token"}'
requests = {'response': {'access_token': '383be57e-3c93-45ee-a0ee-80d3ae10a218', 'token_type': 'bearer', 'refresh_token': '2ff76de6-0f6f-48d3-96be-4f9444a8fac5', 'expires_in': 1295999}}
cl = HandleExtract()
cl.handle_extract(extract_data, requests)