使用postman对请求自动加签名

我们的接口全部做了签名处理,做接口调试的时候可能需要频繁的注释掉后端验签的方法,虽然麻烦,但是可以正常调试。但是如果需要请求一下线上的数据,总不能把线上的验签注释掉吧。
postman是我常用的一个接口测试工具,使用 Pre-request Script 功能在发出请求前执行一些脚本,来达到签名的目的。
Pre-request Script是通过Postman的沙盒(Sandbox)来实现的,而Sandbox是一个JavaScript执行环境,里面内置了一部分常用的JS库和函数。所以我们其实是通过编写JavaScript代码,代码在请求发出前先被执行,从而达到自动生成签名的目的。

首先切换到 pre-request script 窗口,如下图
在这里插入图片描述

获取要签名的参数

我们需要签名的参数会通过get或post传递,所以先要获取到get参数和post参数。
我们以请求 a.com?ab=xxx为例,
get传参为:ab=“xxx”
post 传参为:code=“yyy”

post 参数

在我用的这个版本里,post参数比较好拿到,通过request 对象的data属性可以拿到,获取到的结果是一个对象。

let param = request.data;
console.log(param);

在这里插入图片描述

get参数

get参数折腾了半天,通过多次尝试,在 pm.request.url.query.members 这个结构中拿到了

let queryParam = pm.request.url.query.members;
console.log(queryParam);

在这里插入图片描述

整合get参数和post参数

需要遍历该数组,整理成一个对象,然后再与post得到的参数合并到一个对象,还需要去除sign字段,因为sign字段不能参与签名(这里的sign从哪来的,后面有说明)。过程如下(time是我们的一个校验参数,可忽略):

//将post和get合并,并且移除sign参数
for (let i in queryParam) {
    if (queryParam[i].key == "sign") {
        continue;
    }
    param[queryParam[i].key] = queryParam[i].value;
}
//时间戳参数
param.time = (new Date()).getTime().toString();
pm.environment.set("reqtime", param.time);
签名

我们的签名方法是,先对所有需要签名的参数按照键进行排序,将排序好的参数生成json字符串,然后进行sha1运算,再sha1的结果进行md5运算,个人感觉没必要进行两次运算。当然这个过程进行了加盐。
代码如下:

//排序
param = objSort(param);

//json,然后生成签名
jsonStr = JSON.stringify(param).toString();
let sha1Str = CryptoJS.SHA1(salt+jsonStr).toString();
let md5Str = CryptoJS.MD5(sha1Str).toString();

最后将生成的sign值加入到请求参数中,

postman.setGlobalVariable("sign", md5Str); 

此处的sign是我们在请求的get参数中设置的一个变量,对postman变量不熟悉的话,自行百度吧。postman官网文档上说 request 这个对象是只读的,所以我们没办法自动添加一些请求参数,只能在预先请求的参数中设置好,然后通过变量修改这个参数的值。(另外,如何在一个collection中添加公共参数也没找到)

完整代码

完整代码如下,Pre-rquest Script 可以在三个地方起作用,按照优先级从高到低依次为:collection -> folder(文件夹)->单个request。单个请求的添加方法在上面第一张图的位置;右键collection选择edit,可以在collection上添加脚本;folder的添加方法跟collection一样。

let salt = "xxx";
let param = request.data;   //post 参数
let queryParam = pm.request.url.query.members;  //get中的参数

//将post和get合并,并且移除sign参数
for (let i in queryParam) {
    if (queryParam[i].key == "sign") {
        continue;
    }
    param[queryParam[i].key] = queryParam[i].value;
}
//时间戳参数
param.time = (new Date()).getTime().toString();
pm.environment.set("reqtime", param.time);

//排序
param = objSort(param);

//json,然后生成签名
jsonStr = JSON.stringify(param).toString();
let sha1Str = CryptoJS.SHA1(salt+jsonStr).toString();
let md5Str = CryptoJS.MD5(sha1Str).toString();

postman.setGlobalVariable("sign", md5Str);

//排序方法
function objSort(obj)
{
    let keys = Object.keys(obj).sort();
    let arr = {};
    for (let i in keys) {
        arr[keys[i]] = obj[keys[i]];
    }
    return arr;
}

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Postman发送请求时,可以在请求头中自动填充一些常用的数据。在Postman的界面中,你可以在"header"选项卡中设置请求头数据。你可以输入任何键值对,这些数据将会与接口请求一起发送。在请求头界面上,你可以批量操作、取消勾选、备注等功能。每一行代表一个参数,以冒号 ":" 分隔key和value。如果在参数后面添 "//" 符号,表示这一行是注释,接口请求时注释的参数将不会被发送。在请求头界面上,还有一个"Presets(预设)"按钮,点击它可以进入预设管理页面,可以设置一些常用的请求头。可以通过点击预设下拉框中的选项,将预设的请求自动填充到请求头字段中。如果没有设置请求头,Postman会根据当前请求选择自动一些请求头参数。 需要注意的是,Postman会缓存cookie,当token过期后,重新调用登录接口时,环境中的token可能会变化,但是请求头中的token仍然是过期的token。为了解决这个问题,你可以清除缓存,使得请求头中的token更新为最新的token。 总的来说,通过使用Postman请求自动填充功能,你可以方便地设置和管理常用的请求头参数,并且可以避免手动输入和更新这些参数,提高工作效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Postman系列(五)-设置请求头(header)和Presets(预设管理)](https://blog.csdn.net/weixin_40883833/article/details/126333293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [postman中创建环境和在请求头中自动token](https://blog.csdn.net/yuanchangliang/article/details/117319694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值