接口平台接口之间的数据传递
Posted sysu_lluozh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口平台接口之间的数据传递相关的知识,希望对你有一定的参考价值。
一、使用场景
B接口请求参数依赖于A接口返回的数据,希望B接口发送请求的时候能获取A接口返回的数据作为请求参数
二、实现思路
A接口使用后置操作->提取变量功能将请求完成后返回的对应数据提取到变量
B接口对应的参数值直接引用前面设置的变量
三、使用示例
3.1 前置脚本接口请求提取变量
在前置脚本的Tab,添加接口请求前置,将接口返回Response JSON数据里的token值提取到名为token的变量
3.2 接口参数引用变量
对应的参数值里写入$token$
,即引用可名为token的变量
四、解析数据
往往执行的结果并不能直接赋予变量,比如获取到某一个json数据"clazz": 1,"grade":"unitId":20180220
,需要将该unitId
字段的值赋给变量p1,如何获取呢?
4.1 key value的方式
将返回值中"name": "lluozh平台"…
的name赋值给变量NameStr,填写方式如:
4.2 多级子节点
将返回值中…"address": "street": "科学城", "city": "广东广州", "country": "中国""…
的street赋值给 StreetStr,填写方式如:
4.3 数组
将返回值中…"links": ["name": "Google", "url": "http://www.google.com", "name": "Baidu", "url":"http://www.baidu.com", "name": "SWServer", "url": "http://swqa.gz.cvte.cn/devices"]…
第三个name,即SWServer赋值给LinkNameStr,填写方式如:
支持links[-1].name的方式获取数组数据
五、系统变量
平台提供系统变量 BODY 和 RESPONSE
- BODY:前置条件接口请求的body信息
- RESPONSE:前置条件接口请求的响应值
使用栗子:
RESPONSE为json类型
@getResponseConfigId($RESPONSE$)@
RESPONSE为string类型
@getResponseConfigId("$RESPONSE$")@
六、变量调用
对于不同方式赋值的变量,在运行过程中,都存储于变量池中
在所有输入框输入$
时,该输入框出现下拉列表,下拉列表中为全局变量,选中某个变量后,会自动补全该变量的调用$变量名称$
支持变量中嵌套变量的方式$变量名称1[$变量名称2$]$
类型自动识别
支持自动识别变量的数据类型
"resetPasswordDto":
"dynamicCode": "$dynamicCode$",
"newPassword": "$pwd$",
"username": "$phone$",
"userInfo": "$userInfo$"
如上json格式,四个变量值分别为
dynamicCode = 2356
newPassword = "swapi"
phone = "15800000000"
userInfo =
"class":"高一"
其中dynamicCode 为int类型,newPassword 和phone 为string类型,userInfo 为dict类型
替换后结果是
"resetPasswordDto":
"dynamicCode": 2356,
"newPassword": "swapi",
"username": "15800000000",
"userInfo":
"class":"高一"
针对替换的变量的数据类型进行识别,自动替换数据(如int类型自动去掉双引号)
七、实现源码
def _variable_placeholder_(self, value):
"""
处理全局变量占位符
:param value:
:return:
"""
try:
if isinstance(value, dict):
for key in value:
value[key] = self._variable_placeholder_(value[key])
return value
# 匹配字符串中$$字符
matches = re.findall('\\\\$([\\\\w\\\\.\\\\-\\\\[\\\\]]+)\\\\$', str(value))
# 标志位,是否替换成功
g_flag = True
for match in matches:
# 截取首个字符,判断是否在全局变量中
match_first = str(match).split(".")[0].split("[")[0]
if match_first in HttpsGlobalVar.globalVariables:
# 调用函数处理变量
_value_ = JsonParse().parse_var(str(match), HttpsGlobalVar.globalVariables)
# 非字符串数据类型的value需要替换外面包围的""双引号
if not isinstance(_value_,str):
# 判断是否是None
_value_ = 'null' if _value_ is None else _value_
# findall中[]需要特殊处理
match_replace = match if match_first == match else str(match).replace("[","\\\\[").replace("]","\\\\]")
# 匹配字符串中"$$"字符
if len(re.findall('\\"\\\\$'+match_replace+'\\\\$\\"', str(value))) > 0:
# 如果匹配上即,替换"$$"变量值
value = str(value).replace('\\"$' + match + '$\\"', str(_value_))
elif len(re.findall("\\'\\\\$"+match_replace+"\\\\$\\'", str(value))) >0:
# 如果匹配上即,替换'$$'变量值
value = str(value).replace("\\'$" + match + "$\\'", str(_value_))
else:
# 如果匹配不了,即替换$$变量值
value = str(value).replace('$' + match + '$', str(_value_))
else:
# 字符串类型的数据,直接替换变量值
if len(re.findall("\\'\\\\$"+match_first+"\\\\$\\'", str(value))) > 0:
value = str(value).replace("\\'$" + match + "$\\'", '"'+str(_value_)+'"')
else:
value = str(value).replace('$' + match + '$', str(_value_))
else:
g_flag = False
if g_flag:
# 判断是否仍有匹配的变量
if len(re.findall('\\\\$([\\\\w\\\\.\\\\-\\\\[\\\\]]+)\\\\$', str(value))) != 0:
value = self._variable_placeholder_(value)
return value
except Exception as e:
HttpsGlobalVar.errorObject.error_record("[过程处理-处理全局变量占位符]" + str(e))
traceback.print_exc(e)
return value
以上是关于接口平台接口之间的数据传递的主要内容,如果未能解决你的问题,请参考以下文章