前言:
新公司初来乍到,后台使用的是常见的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没用到啊,为什么还要发,因为不发过去的话,后台的认证是使用这两个参数作为登录的依据,如果不发送的话,会提示未登录。

结尾

这篇文章到这里就结束了,没有看懂或者有问题的小伙伴可以评论区留言,我收到后会及时回复,如果你们觉得这个文章还不错的话,麻烦动动你们的小手,点赞,评论一下本文章,谢谢每一位观看的小伙伴!

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信