Postman这个工具,我想大家应该并不陌生。
我们经常会使用它来调试我们的接口。
但是有时我们的接口是需要签名才可以访问的。
这篇文章就是教大家怎么在发出请求之前自动生成签名
下列文中{ {中间的空格应该删掉。因为文章框架原因才加了一个空格
步骤
1、使用环境变量
在Postman中,环境变量的写法为 { {variable}}
2、在请求前执行脚本赋值环境变量
// 获取当前时间戳
var timestampInSeconds = Math.floor(Date.now() / 1000); // 获取当前时间的整数秒数
console.log(timestampInSeconds);
pm.globals.set("timestamp", timestampInSeconds);
// nonce
var nonce = CryptoJS.MD5(timestampInSeconds+"zrdtest").toString();
console.log(nonce)
pm.globals.set("nonce", nonce);
3、查看console日志
完整实例
以下为拼多多接口请求的完整实例
// 拼多多秘钥
var pdd_client_id = "xxxxx";
var pdd_secret = "xxxxxxx";
// 设置环境变量
pm.globals.set("pdd_client_id", pdd_client_id);
// 获取当前时间戳
var timestampInSeconds = pm.variables.replaceIn('');
console.log(timestampInSeconds);
pm.globals.set("timestamp", timestampInSeconds);
// 计算sign
var queryArr = pm.request.url.query;
console.log('queryArr',queryArr)
// 将数组转换为对象
var queryData = {};
queryArr.each(function(item){
if(item.disabled){
return;
}
// 因为部分参数使用了环境变量,所以需要过滤掉,在后面主动加回来
if(item.key === 'sign'){
return;
}
// 如果已经存在,则跳过
if(item.key in queryData){
return;
}
// 判断是否环境变量字符串
var matchResult = item.value.match(/^$/);
if (matchResult && matchResult.length > 1){
var extractedValue = matchResult[1];
// 获取环境变量
if(pm.globals.get(extractedValue)){
item.value = pm.globals.get(extractedValue)
}else if(pm.environment.get(extractedValue)){
item.value = pm.environment.get(extractedValue)
}else if(pm.variables.get(extractedValue)){
item.value = pm.variables.get(extractedValue)
}
}
// 使用url解析,部分参数是encode后的结果
queryData[item.key] = decodeURIComponent(item.value)
})
console.log(queryData);
// 排序
function ksort(o){
let sorted = {}
keys = Object.keys(o);
keys.sort();
keys.forEach((key)=>{
sorted[key] = o[key]
})
return sorted;
}
// 将对象进行排序
queryData = ksort(queryData)
console.log(queryData)
// 拼接字符串,然后md5
var str = "";
for(var i in queryData){
str += i + queryData[i];
}
console.log(str);
str = pdd_secret + str + pdd_secret;
console.log(str);
// 字符串MD5
var pddsign = CryptoJS.MD5(str).toString();
console.log(pddsign)
// 字符串转大写
pddsign = pddsign.toUpperCase();
pm.globals.set("pddsign", pddsign);
常用脚本
生成时间戳
// 获取当前时间戳
var timestampInSeconds = Math.floor(Date.now() / 1000); // 获取当前时间的整数秒数
console.log(timestampInSeconds);
// 第二种写法
// see: https://learning.postman.com/docs/writing-scripts/script-references/variables-list/
var timestampInSeconds = pm.variables.replaceIn('{ {$timestamp}}')
console.log(timestampInSeconds);
生成MD5
https://cryptojs.gitbook.io/docs/
// nonce
var nonce = CryptoJS.MD5("zrdtest").toString();
console.log(nonce)
获取请求内容
// 获取query内容
var queryArr = pm.request.url.query;
// 将数组转换为对象
var queryData = {};
queryArr.each(function(item){
// 因为部分参数使用了环境变量,所以需要过滤掉,在后面主动加回来
if(item.key === 'sign'){
return;
}
if(item.key in queryData){
return;
}
queryData[item.key] = item.value
})
console.log(queryData);
// 获取post data
var data = pm.request.body.urlencoded;
console.log(data); // 这是一个数组
// 将数组转换为对象
var post_data = {};
data.each(function(item){
post_data[item.key] = item.value
})
对象排序
// 排序
function ksort(o){
let sorted = {}
keys = Object.keys(o);
keys.sort();
keys.forEach((key)=>{
sorted[key] = o[key]
})
return sorted;
}
post_data = ksort(post_data)
console.log(post_data)
导入外部库
pm.sendRequest("https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.11.0/dayjs.min.js", (err, res) => {
//convert the response to text and save it as an environment variable
pm.collectionVariables.set("dayjs_library", res.text());
// eval will evaluate the JavaScript code and initialize the min.js
eval(pm.collectionVariables.get("dayjs_library"));
// you can call methods in the cdn file using this keyword
let today = new Date();
console.log("today=", today);
console.log(this.dayjs(today).format())
})