业务中有这样一个场景,用户可以分享自己名下的设备,可以分享一个也可以分享多个设备,对应的接口中传递的参数是一个数组,key-value是:"sn[]"-"1234567890abc",value值是变化的,用户名下的设备的数量也是变化的,设备的数量和具体值来自于其他接口的返回,不同帐号返回的设备数量不一样,相同帐号也可以解绑或新增设备,所以在做接口自动化的时候要兼容这两种情况,下面是解决这个问题的先后过程:
方案一:固定sn[]数量,
Body如下:
这种方法要求帐号下只能有4个设备,多余或少于4个设备,接口将报错,不符合预期。
方案二:多设置几组键值对,例如,设置10个sn[],这样帐号下设备数量小于10个的时候,传值如下:
"sn[]": "12345"
"sn[]": "67890"
"sn[]": "abcde"
"sn[]": "fghig"
"sn[]": ""
"sn[]": ""
"sn[]": ""
"sn[]": ""
"sn[]": ""
"sn[]": ""
这种情况兼容了帐号下设备变化的情况,但是接口报参数错误,行不通。
方案三:更不能将含有多个设备的串直接付给sn[],Body如下:
{{devSn1}}值为:“123456110000022,123456110000666,123456110000003,123456110000527”这样会被认为是一个无效的数据,行不通。
因为这个问题,困扰了很多天,在网上查了很多资料,并发了一个问答,同时也问了常用postman的后端技术同学,一直没有得到解决,后来苦思冥想,发现一个问题,就是这段时间一直关注body设置中的Value列,只是考虑将这Value列设置为变量,其实扩展一下思路,左侧的Key列是不是也可以设置成变量?既然实际场景中数组的长度是变化的,那么数组的长度就是一个变量,于是,将Key列sn[]也设置为变量,
方案四:body设置key-value双变量,Body如下:
在Pre-request Script中编写如下代码,将实际的设备赋值给sn[],将用不到的sn[]和value设置为空:
//email:邮件(默认);bluetooth:蓝牙
pm.environment.set("shareType", "bluetooth");
//权限:1=管理员;2普通成员(默认)
pm.environment.set("role", 1)
//将字符串拆分成数组(列表)
var devSnsTemp = pm.environment.get("devSns").toString()
const devSnsArry = devSnsTemp.split(',')
for(i=1; i<=devSnsArry.length; i++){
pm.environment.set("sn["+i+"]", "sn[]")
pm.environment.set("devSn"+i, devSnsArry[i-1])
}
//10为预留的参数个数
for(i=devSnsArry.length+1; i<=10; i++){
pm.environment.set("sn["+i+"]", "")
pm.environment.set("devSn"+i, "")
}
发送请求后,查看Request Body:
请求成功,符合预期: