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;
	}


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值