前言:新公司初来乍到,后台使用的是常见的appId+secret用md5加签方式验证接口数据完整性,苦于经理给的一个main方法去测试,每次弄都感觉很麻烦,最近开了postman的高级用法,测试成功觉得还是不错的,在这分享一下。
首先说明,Tests是在接口响应后执行的脚本,而Pre-Request-Script是在接口请求前执行的脚本,这点注意。
然后进入postman,点击右上角这个按钮,可以查看当前的global变量,也就是全局变量,点击这个小眼睛可以看到当前已保存的全局变量。
点击Globals
这里可以预先设置一些全局的baseUrl、appId、secret等变量,以备后边直接拿来使用。
接下来开始正题:
登录
我们这里的登录接口需要一个account账号+password密码,然后我要做的是,把登录返回的cflag和jwttoken存入postman本地的全局变量中,然后其他接口需要用到这两个参数+当前时间戳和后端定义的secret通过MD5加签大写通过header传给后端进行加密验证,前边说到,Tests是方法执行之后触发的内容,然后我要获取到Cookie里的内容,下边是代码:
我用文字提示的那两个方法,大家点击左边就会出现对应的js代码。
因为postman内置了一个node.js库,所以几乎所有的js语法都支持,先别着急运行代码,点击左上角View→Show Postman Console可以弹出log窗口进行调试代码
代码:
var cookies = pm.request.headers.get("Cookie");//从返回值的拿到所有cookie
console.log("从返回cookie拿到:"+cookies);
var cookiesArr = cookies.split(";");//通过分号分隔为数组
console.log("分隔成数组:"+cookiesArr);
for(var i in cookiesArr){
let index = cookiesArr[i].indexOf("=");//通过=等号将键值对分开
let key = cookiesArr[i].substring(0,index);
let value = cookiesArr[i].substring(index+1,cookiesArr[i].length);
console.log("出现的下标:"+index+",key:"+key+",value"+value);
pm.globals.set(key,value);//存入全局变量
}
然后运行:
图中红色框框分别代表我打印的console日志,具体格式大家可以看到,最后结果所有的cookie都根据key value存入了全局变量。
接下来是如何动态获取存入的全局变量,对接口进行加签。
调用
这里以意见反馈接口举例,说明写在图片里边,大家可以看下,代码我贴在图片下边
//var arr = pm.request.body.formdata;//获取传入的所有参数键值对数组
var arr = pm.request.body.urlencoded;
console.log("获取所有输入参数的一个数组:"+arr);
if(null!==arr){
var secret = pm.globals.get("secret");
var formData = arr.toString();
var sign = getSign(formData,secret);
pm.globals.set("sign", sign);
pm.globals.set("time",Math.round(new Date()));
}
//md5 CryptoJS.MD5(str).toString().toUpperCase()
function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
/**
*生成32位UUID
**/
function generateUUID() {
return (S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4());
}
/**
* 签名方法
**/
function getSign(params, kAppSecret) {
let content;
if (typeof params == "string") {
content = params
} else if (typeof params == "object") {
var arr = [];
for (var i in params) {
arr.push(i + "=" + params[i]);
}
content = arr.join("&")
}
var urlStr = content.split("&").sort().join("&");
var newUrl = urlStr + "&key=" + kAppSecret;
console.log(newUrl);
let sign = CryptoJS.MD5(newUrl).toString().toUpperCase();
return sign.toUpperCase();
}
这是我的参数,由于是意见反馈,所以只有一个参数。
请求头:
这里的jwttoken和cflag是登录成功后在tests中存入的,sign和time是刚刚在pre的接口请求前会存入,appId是一开始手动设置进去的全局变量,这个是和后端对应的,强调一下,这种方式只是我们公司的接口签名方式,你们在使用的时候要按照自己的方式来;同时这里我还发现了一个小bug,我在第一步登录的时候存入的jwttoken和cflg使用{{}}获取的时候必须在前边加一个空格,不然就提示undefind,也就是{{ jwttoken}} {{cflag}}这个令我很郁闷,不知道为啥
后端验证签名的策略也是一样的
点击发送请求,看控制台打印
后端也能拿到这写数据,后端自己在后台使用同样的逻辑,拿到appId和后台存的secret带着参数进行md5验证然后对比sign是否一致即可验证参数值完整性,这里有人问我的jwttoken和cflg没用到啊,为什么还要发,因为不发过去的话,后台的认证是使用这两个参数作为登录的依据,如果不发送的话,会提示未登录。
结尾
这篇文章到这里就结束了,没有看懂或者有问题的小伙伴可以评论区留言,我收到后会及时回复,如果你们觉得这个文章还不错的话,麻烦动动你们的小手,点赞,评论一下本文章,谢谢每一位观看的小伙伴!