postman是一个强大的工具,做开发和测试的应该没有不知道的吧。小码哥这次想到的就是把代码里的请求都放到postman里,这样修改数据就方便了。
然而,我们遇到最大的问题就是,每个公司或者每个平台为了数据安全,都会有一套自己的加密和验签算法,就算你的参数是正确的,那签名不正确,数据也不会正常返回。下面小码哥就讲讲如何在postman的预处理脚本中来实现这个验签。
我们知道,发送http请求需要的几个基本条件:请求方式(post/get/put/delete等)、请求域名(xxx.com.cn)、请求参数(get:"?key1=value1&key2&value2" post:"{key1:value1,key2:value2}/file/raw")等等。我们需要在预处理脚本中拿到这些数据,并加以处理,得到验签的数据后,再放回到请求参数中,进行更新,这样就完成了数据的替换更新,postman再次请求的数据就是已经验签好的了,自然返回的数据也就没有问题了。下面我们就看下如何获取这些参数,并进行算签。
获取请求参数
目前大部分的请求都是post或者get,所以以这两个举例
// 获取请求方法
const requestMethod = pm.request.method;
// 获取请求参数,注意这里判断只有get和post的情况,其他情况请按照需求修改
let params = (requestMethod === 'GET') ? pm.request.url.query.toObject() : pm.request.body.toJSON();
2.设置默认参数
大部分的网络请求都会带上一个时间戳和一个apikey,来判断网络请求的有效期,有效期一般10分钟,apikey是对客户端进行区分的,从而防止抓包的网络攻击,所以我们要加上一个ts的默认请求参数,如下
// 设置默认参数
const defaultParams = {
apikey: 'test',
ts: Date.now()
};
3.合并请求参数
// 合并参数
Object.assign(params, defaultParams);
4.对请求的参数进行算签
对应apikey还会有一个apisecret,apisecret相当于apikey对应的密码,这个要妥善保存,可以做拆分或者再做一层加密,防止泄露。
算签的算法为了方便开发人员,一般过程都大差不差,常用的操作方式就是:1.得到参数,然后把参数排序用一定的方式拼接成一个要算签的字符串,我们这里称为signStr.2.然后对这个signStr进行一个简单的加密,一般是获取字符串的MD5值,得到的最后结果就是签名,一般我们称为sign。
一个简单的验签算法如下
// 生成签名
// 把key按照字母序进行排序
const apiSecret='xxxxx';
const sortedKeys = Object.keys(params).sort();
// 把所有参数进行字符串拼接得到signStr
const signStr = sortedKeys.map(key => `${key}=${params[key]}`).join('|');
const sign = CryptoJS.MD5(`${signStr}${apiSecret}`).toString();
5.把算出来的签名添加到请求参数里去
params.sign = sign;
6.最后更新请求参数
这里也要根据请求方式来更新
// 更新请求参数
if (requestMethod === 'GET') {
pm.request.url.query = Object.keys(params)
.map(key => `${key}=${params[key]}`)
.join('&');
} else if (requestMethod === 'POST') {
pm.request.body = params;
}
好了,这个签名我们更新上去以后,就可以直接请求了。
完整的代码,我列在这里,这个只是我自建的一个简单的算法,具体的情况要根据公司的需求来进行修改,例如目前很多post请求并不是表单,大部分都是在raw中上传json字符串,我们就需要用到postman里pm.request.body.raw字段,还有的需要在header里添加对应的字段等等,后面我会继续更新,将这部分补充完整,对您有帮助的话,欢迎关注北漂小码哥公众号。如果以上有不明白的,也可以在下面留言。
// 获取请求方法和完整的请求URL
const requestMethod = pm.request.method;
// 获取请求参数
let params = (requestMethod === 'GET') ? pm.request.url.query.toObject() : pm.request.body.toJSON();
// 设置默认参数
const defaultParams = {
apikey: 'test',
ts: Date.now(),
};
// 合并参数
Object.assign(params, defaultParams);
const apiSecret='xxxxx';
// 生成签名
const sortedKeys = Object.keys(params).sort();
const signStr = sortedKeys.map(key => `${key}=${params[key]}`).join('|');
const sign = CryptoJS.MD5(`${signStr}${apiSecret}`).toString();
params.sign = sign;
// 更新请求参数
if (requestMethod === 'GET') {
pm.request.url.query = Object.keys(params)
.map(key => `${key}=${params[key]}`)
.join('&');
} else if (requestMethod === 'POST') {
pm.request.body = params;
}
上一条:postman如何使用
下一条:Toad for Oracle助力数据库操作现代化,为您提高业务敏捷性!