Postman脚本使用

Postman自动生成签名

Posted by 张晨 on December 4, 2023

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())
})

参考链接

Postman预处理脚本文档

CryptoJS工具文档

Postman对象文档

环境变量列表