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