MetersPhere参数赋值时间戳+对接口参数进行加密—form-data格式请求

需求:我的接口参数中有时间戳和被加密的sign值

第一个脚本,获取当前时间戳

long valnext = System.currentTimeMillis();
log.info("时间转时间戳:"+ valnext);
//这里一定要把参数toString,因为这个方法是不可以使用其他类型的。
vars.put("valnext", valnext.toString());

第二个脚本,获取当前固定格式时间

import java.util.*;
import java.text.SimpleDateFormat;
//2022.11.17-14:06:42
// 根据需求转换指定时间格式的时间戳
String form = "yyyy.MM.dd-HH:mm:ss";
Date date=new Date();
SimpleDateFormat sdf = new SimpleDateFormat(form);
String valformat = sdf.format(date);
log.info("当前日期:"+ valformat);
// vars.put(${__metersphere_env_id}+"valformat",valformat); 这里不用设置成全局变量
vars.put("valformat", valformat)


第三个脚本,生成sign值

import org.apache.jmeter.config.Arguments;
import java.util.Map.Entry;
import org.apache.commons.codec.digest.DigestUtils;Arguments args = sampler.getArguments();Map map = args.getArgumentsAsMap();
// Iterator itor = map.entrySet().iterator();// while(itor.hasNext()){//     Entry entry = (Entry) itor.next();
//     log.info("---key-----"+entry.getKey());
//     log.info("---value-----"+entry.getValue());// }Map sortedParams = new TreeMap(map);
StringBuilder builder = new StringBuilder();// 3.遍历排序后的字典,将所有参数按"keyvalue"格式拼接在一起,拼接到最后会多出来一个&
for (Entry param : sortedParams.entrySet()) {builder.append(param.getKey()).append("=").append(param.getValue()).append("&");
}
String low=builder.toString();
log.info(low);// String high =low.trim("&");
// log.info(high);
//获取builder的长度-1
length = builder.length()-1;
log.info(length.toString());
//截取掉最后一个&
StringBuilder nicehh=builder.substring(0,length);
log.info(nicehh.toString());
//这一步很奇怪,必须定义这个whyotcan,否则直接使用nicehh.append()的话,会报错说string没有append这个方法,不知道为什么
StringBuilder whyotcan = new StringBuilder(nicehh);
//在末尾加上我们用来加密的密钥
whyotcan.append("XXXXXXXXX");
log.info(whyotcan.toString());
String signoff=whyotcan.toString();
//md5加密
signs = DigestUtils.md5Hex(signoff);
log.info(signs);
//通过sampler将我们生成的sign值插入到我们请求的参数里
sampler.addArgument("sign", signs);

结果

最后,把三个脚本合并到一起

import java.util.*;
import java.text.SimpleDateFormat;
import org.apache.jmeter.config.Arguments;
import java.util.Map.Entry;
import org.apache.commons.codec.digest.DigestUtils;
//2022.11.17-14:06:42
// 根据需求转换指定时间格式的时间戳
String form = "yyyy.MM.dd-HH:mm:ss";
Date date=new Date();
SimpleDateFormat sdf = new SimpleDateFormat(form);
String valformat = sdf.format(date);
log.info("当前日期:"+ valformat);
// vars.put(${__metersphere_env_id}+"valformat",valformat);
vars.put("valformat", valformat);long valnext = System.currentTimeMillis();
log.info("时间转时间戳:"+ valnext);
//这里一定要把参数toString,因为这个方法是不可以使用其他类型的。
vars.put("valnext", valnext.toString());
Arguments args = sampler.getArguments();sampler.addArgument("timestamp",valnext.toString());
sampler.addArgument("ttkn",valformat);//自己抓包修改该值
sampler.addArgument("clientId", "170976fa8a6466d83be");
//自己抓包修改该值
sampler.addArgument("clientSign", "21");
//自己抓包修改该值
sampler.addArgument("clientVersion", "6260");
//自己抓包修改该值
sampler.addArgument("osVersion", "10");
//自己抓包修改该值
sampler.addArgument("ticket", "fed4d20cf45ebce7b0f0dbb2cefa2c2c");Map map = args.getArgumentsAsMap();
// Iterator itor = map.entrySet().iterator();// while(itor.hasNext()){//     Entry entry = (Entry) itor.next();
//     log.info("---key-----"+entry.getKey());
//     log.info("---value-----"+entry.getValue());// }Map sortedParams = new TreeMap(map);
StringBuilder builder = new StringBuilder();// 3.遍历排序后的字典,将所有参数按"keyvalue"格式拼接在一起
for (Entry param : sortedParams.entrySet()) {builder.append(param.getKey()).append("=").append(param.getValue()).append("&");
}
String low=builder.toString();
log.info(low);// String high =low.trim("&");
// log.info(high);
length = builder.length()-1;
log.info(length.toString());
StringBuilder nicehh=builder.substring(0,length);
log.info(nicehh.toString());
//这一步很奇怪,必须定义这个whyotcan,否则直接使用nicehh.append()的话,会报错说string没有append这个方法,不知道为什么
StringBuilder whyotcan = new StringBuilder(nicehh);
whyotcan.append("xxxxxx");
log.info(whyotcan.toString());
String signoff=whyotcan.toString();
signs = DigestUtils.md5Hex(signoff);
log.info(signs);
vars.put("signs", signs);
sampler.addArgument("sign", signs);

为了研究这个搞了很久,主要是对脚本不了解,卡在了怎么获取参数,和将加密好的sign值怎么放回去的这些步骤上,然后了解到了Arguments

Arguments 官方文档
更多的内容可以参考这位老哥的博客
JMeter中的全能Sampler - Java Request
下面还有一个get请求实战的博客
MeterSphere根据接口参数签名的请求脚本

需求:项目中遇到需要对请求参数签名后再发送的需求.

举个栗子:用户输入的参数只有args这个,但真正完整的请求是下面这个

http://localhost:8080/api=A001&uid=test&args=xxxx&sign=xxx

其中 sign 这个值是 根据 api,uid,args 这个三个参数的值加时间戳签名生成的,所以,虽然同样的请求参数但真正发送出去的每次其实都不一样(sign的值会不一样)

import org.apache.jmeter.config.*;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.UnsupportedEncodingException;
import org.json.*;//请求截获
String  query = sampler.getUrl().getQuery();
log.info("-------截获请求原路径-----"+query);//请求参数字符串分割处理
String[] temp = query.split("&");
Map m = new HashMap();
for(String s:temp){//再根据分割出来的字符串按=号转成k-vString[] ms = s.split("=");if(ms.length > 1){m.put(ms[0], ms[1]);}else{m.put(ms[0], "");}
}
//把截获的请求参数转换成json格式
JSONObject json = new JSONObject(m);String api = m.get("api");
String uid = m.get("uid");
String params = m.get("args");
String key = vars.get("key");long start = System.currentTimeMillis();
//签名
String format = "uid="+uid+"&api="+api+"&args="+params+"&time="+start+"&key="+key;
sign = DigestUtils.md5Hex(format);
log.info("-----------sign--------------"+sign);//因为args中包含中文,所以需要encode一下
String urlString = URLEncoder.encode(params, "utf-8");  //输出%E4%BD%A0%E5%A5%BD
log.info("-----------urlencode--------------"+urlString);
vars.put("args",urlString);//重新拼接请求
String newurl = "api="+api+"&uid="+uid+"&args="+urlString+"&sign="+sign;
log.info("-----------newurl--------------"+newurl);//获取请求路径
String path = sampler.getUrl().getPath();
log.info(path);// 把构建好的参数加到query中去
String path_send = sampler.getPath()+newurl;// 重新设置path
sampler.setPath(path+"?"+newurl);
log.info("-----------Api----"+api+"-----请求构造完成!----------");

上面这个脚本的请求是get请求,参数都是拼接在请求url里的, 所以只需要对请求的url处理就行了。其他的请求头和请求参数的处理参考如下:

import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.control.Header;
import org.apache.jmeter.protocol.http.util.HTTPArgument;HeaderManager headerManager = sampler.getHeaderManager();
Map headerMap = new HashMap();//获取请求头if(headerManager != null){for(int i=0;i<headerManager.size();i++){Header header = headerManager.get(i);headerMap.put(header.getName(),header.getValue());}
}//获取请求参数Arguments args = sampler.getArguments();
int n = args.getArgumentCount();
//参数存入map中
Map params = new HashMap();
//获取参数名
//log.info(args.getArgument(0).getName());
//获取参数值
//log.info(args.getArgument(0).getValue());
for(int x=0;x<n;x++){params.put(args.getArgument(x).getName(),args.getArgument(x).getValue());
}

MetersPhere参数赋值时间戳+对接口参数进行加密---form-data格式请求相关推荐

  1. 【Groovy】闭包 Closure ( 自定义闭包参数 | 自定义单个闭包参数 | 自定义多个闭包参数 | 闭包参数默认值指定 )

    文章目录 一.自定义闭包参数列表 1.定义一个自定义参数的闭包 2.定义多个自定义参数的闭包 3.为闭包参数指定默认值 二.完整代码示例 一.自定义闭包参数列表 如果要向 闭包 中 , 传递多个参数 ...

  2. flux读取不到数据_WebFlux 中form data获取不到参数问题

    Spring WebFlux 中, request.queryParams 只能获取到 查询参数, 对于 form 提交的参数无法进行参数自动装载 处理方式有两种: 一. 自定义 ArgumentRe ...

  3. 位操作的应用:无参数交换数据,异或加密,循环移位加密【位操作】(56)

    有参数交换数据 无参数交换数据 异或加密(文本与二进制) key 为单个字符 key 为字符串 循环移位加密(文本与二进制) 有参数交换数据 #include <stdio.h>void ...

  4. 汇编-子程序参数传递的三种方式-寄存器法,堆栈法,参数赋值法【详述后两者】

    汇编-子程序参数传递的三种方式: 寄存器法,堆栈法,参数赋值法 子程序结构如下: 名称 PROC FAR|NEAR;DO SOMETHINGRET [N];返回断点地址,N可忽略,加了必须对SP进行 ...

  5. matlab 赋空值,未对输出参数赋值 求大神帮忙解惑

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 x=imread('F:/flower.bmp'); wname='db5' [Lo_D,Hi_D] = wfilters(wname); lf=leng ...

  6. mybatis按datetime条件查询,参数为时间戳时

    mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...

  7. python训练模型函数参数_keras读取训练好的模型参数并把参数赋值给其它模型详解...

    介绍 本博文中的代码,实现的是加载训练好的模型model_halcon_resenet.h5,并把该模型的参数赋值给两个不同的新的model. 函数式模型 官网上给出的调用一个训练好模型,并输出任意层 ...

  8. java短信模板变量参数赋值_JIEQI CMS模板制作必读(JIEQI CMS模板 - 2.赋值变量形式)...

    11.JIEQI CMS模板 - 2.赋值变量形式 二.赋值变量形式 1.任何变量必须是 $ 符号开头的一个只能包含英文数字和下划线的字符串,如 {?$my_var?}. 例子: ---------- ...

  9. 调用“elm_kernel_adda>kernel_matrix3“时,未对输出参数“omega“ (可能还包括其他参数)赋值。

    调用"elm_kernel_adda>kernel_matrix3"时,未对输出参数"omega" (可能还包括其他参数)赋值. 出错elm_kernel ...

最新文章

  1. 自行车为什么前轮和后轮受到的摩擦力相反呢 自行车前轮后轮转动方向一样 自行车运动原理...
  2. 不可不知的STL sort函数实现原理
  3. Python 之 matplotlib (十二) subplot
  4. 微信关闭html5游戏吗,5月20日起,微信将彻底关闭这个功能!
  5. 通过css类/选择器选取元素 文档结构和遍历 元素树的文档
  6. RecyclerView的那点事儿
  7. LeetCode MySQL 608. 树节点
  8. 【小马哥】Spring Cloud系列讲座
  9. 剑与轮回找回服务器,剑与轮回自由之都1服开服时间表_剑与轮回新区开服预告_第一手游网手游开服表...
  10. 用java自动化访问百度测试_java+eclipse+selenium+百度搜索设置自动化测试
  11. Ranger-Sqoop2插件安装
  12. postfix发送邮件报错:mail for xxxxx.com loops back to myself
  13. PowerDesigner执行sql脚本方式建立数据模型
  14. win10电脑360调用不到JAVA,win7/win10系统360浏览器打不开原因及解决方法
  15. 34、BDS B1I星历处理实现
  16. win10音频服务器未修复,win10十月更新音频输出设备未安装错误修复教程
  17. 基于SSM的概念可视化程序设计学习系统 毕业设计-附源码021009
  18. ibatis中配置parameterClass=java.util.HashMap的用法
  19. 就业难!如何“解救”2022年的应届毕业生......
  20. js根据身份证号码判断性别

热门文章

  1. 51nod_1000
  2. 2021-3-21-第三周
  3. 如何查看直播间在线人数?观看软件数据分析
  4. C2 - Pokémon Army (hard version)(思维+差分/线段树+dp)详解
  5. pthread_getspecific pthread_setspecific
  6. 【AI选股】如何通过python调用通达信-小达实现AI选股(量化又多了一个选股工具)
  7. PyCharm调试时一直显示collecting data
  8. 拉流与推流的区别_RTSP协议交互流程之推流分析
  9. was mutated while being enumerated.
  10. 2022年末最新最全Java学习路线,结合工作经验和培训机构整理