使用Postman调试接口
在后台接口开发中,使用postman调试接口,需要token以及签名信息
设置集合变量
在集合中设置集合变量:token
以及secretKey
,用于存放token以及签名所需私钥,值给空就行
在集合中添加签名脚本
在集合的编辑页中打开scripts标签,在Pre-request中设置签名脚本
签名脚本如下:
JavaScript 全选
// 获取集合变量
var token = pm.collectionVariables.get("token");
var secretKey = pm.collectionVariables.get("secretKey") || 'www.yesdotnet.com';
// 添加token
pm.request.headers.add({key:'Authorization',value:`Bearer ${token}`})
// 计算签名的字典
var dictSign = []
// url
const urlPath = pm.request.url.toString().toLowerCase().match(/\/api\/[^\\?]+/)[0];
dictSign.push({name:'url',value:urlPath})
// 时间戳
const timestampSeconds = Math.floor(Date.now() / 1000);
pm.request.headers.add({key:'time',value:timestampSeconds})
dictSign.push({name:'time',value:timestampSeconds})
// 随机字符串
var guid = Math.random().toString(36).slice(-8)
pm.request.headers.add({key:'guid',value:guid})
dictSign.push({name:'guid',value:guid})
// 处理Query参数
pm.request.url.query.all().forEach(param=>{
dictSign.push({name:param.key,value:param.value})
})
// 处理 post参数
if(pm.request.method.toLowerCase() == 'post'){
if (pm.request.body && pm.request.body.mode === 'raw') {
const requestBody = pm.request.body.raw; // 获取原始 JSON 数据
if (requestBody) {
dictSign.push({name:'postdata',value:requestBody})
}
}
}
// 参数排序
dictSign.sort((item1,item2) => {
return item1.name.toLowerCase() > item2.name.toLowerCase() ? 1 : -1
})
function typeOf(obj) {
const toString = Object.prototype.toString
const map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object',
}
return map[toString.call(obj)]
}
function getValue(obj) {
var type = typeOf(obj)
var str = ''
switch (type) {
case 'object':
case 'array':
str = JSON.stringify(obj, (key,value)=>{
if (obj[key] instanceof Date) {
return dateUtils.format(obj[key], 'yyyy-MM-dd hh:mm:ss')
}
return value
})
break
case 'date':
str = dateUtils.format(obj, 'yyyy-MM-dd hh:mm:ss')
break
default:
str = obj
break
}
return str
}
// 拼接待签名字符串
var signStrArray = []
dictSign.forEach(item => {
if (item.value != null) {
signStrArray.push(item.name + '=' + getValue(item.value))
}
})
var signStr = signStrArray.join("&")
// 拼接私钥:
signStr=signStr+secretKey
// 字符串处理
signStr = signStr.replace(/[\r\n]/g, '') //去掉回车换行
signStr = signStr.replace(/\t/g, '') //去掉回车换行
// signStr = signStr.replace(/\ +/g, ''); //去掉空格
signStr = signStr.replace(/ +/g, '') //去掉空格
signStr = signStr.replace(/[ ]/g, '') //去掉空格
var md5 = require('crypto-js').MD5(signStr).toString(); //MD5摘要
pm.request.headers.add({key:'sign',value:md5})
/*
const getParams = pm.request.url.query;
let params = {};
let urlAndBodyParams = {};
//获取请求参数名
getParams.each((singleGetParam)=>{
if (!singleGetParam.disabled){
const key = singleGetParam.key;
const value = singleGetParam.value;
Object.assign(params, {[key]: value});
}
});
//拼接请求参数、body参数
urlAndBodyParams = Object.assign(params, request.data);
//参数名按照ASCII码升序排序
urlAndBodyKeys = Object.keys(urlAndBodyParams).sort();
var signStr = [];
//拼接待签名字符串
for (var p = 0; p < urlAndBodyKeys.length; p++) {
//摘取公参,公参不参与签名
if(urlAndBodyKeys[p] == "test1" || urlAndBodyKeys[p] == "test2" ){
continue;
}
signStr.push(urlAndBodyKeys[p] + "=" + urlAndBodyParams[urlAndBodyKeys[p]]);
}
//拼接固定字符串
signStr.push('key=' + '1234567890')
var sign = signStr.join("&")
var md5 = CryptoJS.MD5(sign).toString(); //MD5摘要
//放入环境变量
postman.setGlobalVariable("md5msg", md5);
*/
添加登录请求,并自动设置token信息
请求需要处于上一步的集合内,不然无法生效
添加登录接口,并设置Scripts的Post-response脚本
脚本如下:
JavaScript 全选
/**
* 成功登录后自动提取token以及secretKey
*/
if(pm.response.code==200) {
var responseData = pm.response.json()
pm.collectionVariables.set("token", responseData.data.token);
pm.collectionVariables.set("secretKey", responseData.data.secretKey);
}
设置完成后发起登录请求,会自动设置集合的token以及secretKey值,在集合内发起其他请求时,就会自动的携带token信息并且计算签名了。
如果发现token过期等情况,只需要重新发起一次登录请求,就可以了,不需要再手动去配置参数
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
YESWEB 张国生