Postman调试技巧之接口签名
Postman Makes API Development Simple
https://juejin.im/post/5b4579a0e51d4519133f7e28
我们的请求参数中的时间戳是动态的,通过设置环境变量只能设置静态值,但是postman 的强大之处在于可以在执行post 请求之前可以先执行一段代码。就是在pre_request_script 中写入一段javascript 代码。通过这个功能,那么就可以生成一些签名验证之类的数据。可以看到在右边 的 set an environment variale,通过这样的方式就能设置环境变量的一个动态值。上图中的代码即生成当前时间。
当然啦,我并不满足于此,因为接口中有签名验证,并且我不想再每次测试时都在自己的代码中注释掉验证的代码。并且如果是你调用别人的 接口,别人肯定不会注释掉签名验证的代码。所以我就自己根据接口中的签名规则写了一套签名验证的方法。
//在不同的环境需要更改 {{appkey}} 以及 {{appsercet}}
/*签名方法:对于不同的环境,签名方法可能会不一样。
将url中的key值从按照字典序从小到大排序,然后将url中的参数、参数值和请求体拼接起来,并在首尾加上appsecret。
拼接后的效果就是:
{{appsecrte}}appkeytestformatjsonmethodtrade.weightsidwms_testsign_methodmd5timestamp2017
-07-2600:00:07{{request_body}}{{appsecrte}}
在将这个字符串进行md5,加密。加密后的字符串再转为大写。这个结果就是最后的{{sign}}值
*/
var timestamp = getTimeStamp();
pm.environment.set("timestamp", timestamp);
var sign = makeSign();
pm.environment.set("sign", sign);
//获取时间戳
function getTimeStamp()
{
var time = Date();
var date = new Date(time);
Y = date.getFullYear() + '-';
M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
D = date.getDate() + ' ';
h = date.getHours() + ':';
m = date.getMinutes() + ':';
s = date.getSeconds();
time = Y+M+D+h+m+s;
return time;
}
function makeSign() //得到md5签名
{
var requestUrl = request.url; //获取url 字符串
var requestBody=request.data; //获取请求体
var appsecret = pm.environment.get("appsecret"); //appsercet 随环境而改变
var position = requestUrl.indexOf('?');
requestUrl = requestUrl.substring(position+1);
var keyValueArr =requestUrl.split("&");
var paramsArr = {};
var key = "", value = "";
for(var i= 0, count = keyValueArr.length; i < count; i++)
{
position = keyValueArr[i].indexOf('=');
key = keyValueArr[i].substring(0,position);
switch (key)
{
case "timestamp":
value = pm.environment.get("timestamp");
break;
case "appkey":
value = pm.environment.get("appkey"); //appkey随环境而改变
break;
default:
value = keyValueArr[i].substring(position+1);
break;
}
paramsArr[key] = value;
}
paramsArr = objKeySort(paramsArr); //paramsArr 数组按照字典序排序
var md5Str = "";
for(key in paramsArr)
{
if(key == "sign")
{
continue;
}
md5Str += key+paramsArr[key];
}
md5Str = appsecret + md5Str + requestBody+ appsecret;
// md5Str = md5Str.replace(/\s+/g,""); //去除空白字符
console.log((md5Str));
var sign = CryptoJS.MD5(md5Str).toString().toUpperCase();
return sign;
}
function objKeySort(arys) //将关联数组按照key 字典序排序,返回值是排序后的数组。
{
//先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
var newkey = Object.keys(arys).sort();
var newObj = {}; //创建一个新的对象,用于存放排好序的键值对
for(var i = 0; i < newkey.length; i++) {
newObj[newkey[i]] = arys[newkey[i]];
}
return newObj;
}