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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章