Postman预处理自动生成签名参数(sign)

本文介绍如何使用Postman预处理脚本自动生成签名参数(sign),适用于GET和POST请求,包括表单和JSON格式的BODY。同时,展示了如何利用环境变量保持登录状态,提升测试效率。

Postman预处理自动生成签名参数(sign)

很多接口会有签名参数,为了防止被恶意篡改参数,所以对所有参数用一定规则排列后+盐再MD5加密。

  1. 有些开发可能配置了在测试环境暂时屏蔽签名,或者用一个通用签名。但其实完全可以在不破坏系统完整性的前提下,又能很轻松的让postman根据规则自动生成签名参数来进行测试。

在这里插入图片描述

  1. 这2条语句可以分别获得body参数和url中的query参数。

在这里插入图片描述

  1. 源码如下:
let queryParam = pm.request.url.query.members;
let param = request.data;
let key = "xxxxxxxxxxxx"; //签名Key

try {
  let json = JSON.parse(param); //序列化JSON BODY
  param = json;
  }catch(err){
  //BODY不是JSON格式
  }

//Get & 合并GET和POST参数
for (let i in queryParam){
    param[queryParam[i].key] = queryParam[i].value;
}

//Post
//取key
var keys = [];
for (let k in param){
    if (k == 'sign'){
        continue;
    }
    keys.push(k);
    
}
//排序
keys.sort();

//取value
var kv = [];
for (let k of keys){
    kv.push(k + '=' + encodeURIComponent(param[k])) //urlencode编码
    
}

//拼接
var sign = kv.join('&');
sign = sign + key;
console.log(sign);
sign = CryptoJS.MD5(sign).toString();
console.log(sign);

//设置环境变量
postman.setEnvironmentVariable("sign", sign);

PS: 不同公司、不同接口规则不同,例如不需要urlencode、不需要排序的请自行修改脚本

  1. 再用{{sign}}从环境变量中取出sign值。

在这里插入图片描述

  1. 成功请求

在这里插入图片描述

  1. 这段脚本兼容GET参数、以及表单形式的BODY和JSON形式的BODY

在这里插入图片描述

保持登录状态

通过设置环境变量,我们可以把登录接口返回的认证信息存起来,之后其他接口可以直接从环境变量中获取。达到保持登录状态的效果。

  1. 先在登录接口的Tests中获取token参数并放到环境变量中

在这里插入图片描述

//设置token
var responeData = JSON.parse(responseBody); //把响应结果转为JSON对象
pm.environment.set("token", responeData.data.token); //从响应结果JSON对象中获取到token参数,并放到环境变量
console.log("token: " + responeData.data.b_token); 
  1. 然后在业务接口的头信息中,用{{token}}方式从环境变量中获取token实际值。

在这里插入图片描述

请完整阅读完我的发言后再回答,我的发言中已经给你了需要的请求体数据,流数据的处理逻辑和需要你改写的脚本,现在我有一段消息体数据:{"isendLevel":"1","unitId":"2ce25663d6614d4fb010f913ec1a25f4","levelName":"压测专用单词跟读","jsonobject":"[{\"learn_time\":\"3\",\"fluency\":\"0\",\"xmlPath\":\"2000000026000000001\\\/abf0c489bd17448ea28d81d780dfb897\\\/ee1ef4ca2a1844f88716675320e7bcd0\\\/t1\\\/2f803dff2a9c41b9839972655b9dfa42\\\/1756109482\\\/0_0.xml\",\"ansDetail\":\"hello.#76\",\"recordPath\":\"2000000026000000001\\\/abf0c489bd17448ea28d81d780dfb897\\\/ee1ef4ca2a1844f88716675320e7bcd0\\\/t1\\\/2f803dff2a9c41b9839972655b9dfa42\\\/1756109482\\\/0_0.mp3\",\"mp3FilePath\":\"\\\/var\\\/mobile\\\/Containers\\\/Data\\\/Application\\\/6B97B168-E06D-432F-9242-62033F423337\\\/Documents\\\/0_0.mp3\",\"xmlFilePath\":\"\\\/var\\\/mobile\\\/Containers\\\/Data\\\/Application\\\/6B97B168-E06D-432F-9242-62033F423337\\\/Documents\\\/0_0.xml\",\"questionId\":\"ee1ef4ca2a1844f88716675320e7bcd0#0#0\",\"accuracy\":\"0\",\"complete\":\"0\",\"score\":\"76\",\"semantic\":\"0\"}]","schoolId":"2000000026000000001","type":"1","levelId":"28444e91e51f4031b3282c2d5ef7f46a","taskId":"2f803dff2a9c41b9839972655b9dfa42","oldQuestionId":"ee1ef4ca2a1844f88716675320e7bcd0","classId":"2811000226001564227,2811000226001564228,2811000226001564229,2811000226001564230,","studentId":"abf0c489bd17448ea28d81d780dfb897","rolename":"STU"} 我现在在用jmeter调试接口,现在需要你帮我改写一段脚本,参考提问中的消息体数据,在脚本中加入接口包含流的处理,处理逻辑是: //如果地址包含流操作的地址 if(iscontains(request,GZIP CHECK URL)){ //从流操作的地址中获取所有的参数集合 //Map<String, object>pMap = GzipRequestWrapper.gzip(request); String params = GZipDecodeUtil.decodeGZipTostring(request); if(paramsnull) {return null; } Map<String, object>pMapJSON parseobiect(params,Map.class); if(pMap = null){ return null; } request,setAttribute(s:"submitchallengeRec"",params); //获取参数集合key的set集合 Set<String>keySet = pMap.keySet(); //循环set集合得到每一个key值 for(object key :keySet.toArray()){ String parakey = key.tostring(); String paraValue = null; //将所有的request中map集合中的value值转化为String类型 paraValue=((string)pMap.get(parakey)); //将转化好的key,value值放到结合中 map.put(parakey, paraValue); 转成map排序后,再按照脚本原有逻辑排序参数+mykey+token+uuid通过md5生成sign,并存储到对应的变量中 需要修改的脚本内容是:// 导入必要的 Java 类 var URL = Java.type('java.net.URL'); var URLDecoder = Java.type('java.net.URLDecoder'); var MessageDigest = Java.type('java.security.MessageDigest'); var UUID = Java.type('java.util.UUID'); // 生成签名的函数 function generateSign(params, uuid, tokenstu) { var myKey = 'fifedu@2014-9999!@#'; // 提取参数值并处理列表类型 var values = []; for (var key in params) { var value = params[key]; if (value instanceof java.util.List) { // 处理列表值:取第一个非空元素 for (var i = 0; i < value.size(); i++) { if (value.get(i) !== null && value.get(i).toString().trim() !== '') { values.push(value.get(i).toString()); break; } } } else if (value !== null && value.toString().trim() !== '') { // 处理普通值 values.push(value.toString()); } } // 排序并连接值 values.sort(); var text = values.join('') + myKey + tokenstu + uuid; vars.put('text_stu9', text); // 生成 MD5 签名 var md = MessageDigest.getInstance('MD5'); var digest = md.digest(new java.lang.String(text).getBytes('UTF-8')); // 将字节数组转换为十六进制字符串 var hexString = ''; for (var i = 0; i < digest.length; i++) { var hex = (digest[i] & 0xFF).toString(16); if (hex.length === 1) { hex = '0' + hex; } hexString += hex; } return hexString; } // 1. 生成随机 UUID var generatedUuid = UUID.randomUUID().toString(); vars.put('uuid', generatedUuid); // 获取当前采样器的 URL 和查询参数 var samplerUrl = sampler.getUrl().toString(); var url = new URL(samplerUrl); var query = url.getQuery(); // 解析查询参数 var params = {}; if (query !== null) { var queryPairs = query.split('&'); for (var i = 0; i < queryPairs.length; i++) { var pair = queryPairs[i].split('=', 2); var name = URLDecoder.decode(pair[0], 'UTF-8'); var value = pair.length > 1 ? URLDecoder.decode(pair[1], 'UTF-8') : ''; params[name] = value; } } // 生成签名并存储变量 var tokenstu = vars.get('tokenstu') || ''; vars.put('signstu9', generateSign(params, generatedUuid, tokenstu)); vars.put('uuid_stu9', generatedUuid); vars.put('token_stu9', tokenstu); vars.put('params_stu9', JSON.stringify(params)); // 使用 JSON 代替 inspect()
最新发布
08-26
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值