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