团购网站建设方案石家庄房价
Jmeter 请求签名api接口-BeanShell
- 项目签名说明
 - 编译扩展jar包
 - jmeter 使用 BeanShell 调用jar包中的签名方法
 
项目签名说明
有签名算法的api接口本地不好测试,使用BeanShell 扩展jar 包对参数进行签名,接口签名算法使用 sha512Hex 算法。签名的说明如下
- 请求参数类型
body 参数
原始字符串 originData 
appId=appId&appKey=appKey&timeStamp=当前时间戳&body=json参数
 
- request 参数
原始字符串 originData 
appId=appId&appKey=appKey&timeStamp=当前时间戳&key1=value1&key2=value2
 
key 按照升序排列
- 签名算法
使用 sha512Hex 签名算法 
String inputData = "name=scd&address=广东";
String encodeData = URLEncoder.encode(inputData, StandardCharsets.UTF_8.name());
String result = DigestUtil.sha512Hex(encodeData, StandardCharsets.UTF_8.name());
System.out.println(result);
 
originData 使用 URLEncoder.encode 编码,避免出现中文。在使用 sha512Hex 算法计算出签名串 sign
- 请求头数据
 
sign:sign
timestamp:1701948943849
appId:xxx
 
项目地址
 https://gitee.com/3281328128/web-jdk17/tree/dev/
启动项目后 swagger 访问地址
 http://localhost:8080/boot3/swagger-ui/index.html
 
编译扩展jar包
jmeter 支持扩展的jar包,使用BeanShell调用jar包中的方法。项目地址为https://gitee.com/3281328128/jmeter-api-sign。目前jmeter5.6.2版本支持jdk8编译的扩展jar,之前用jdk17编译出来的扩展jar包,不能运行签名算法,后面改成使用jdk8编译的jar包
引用的jar包需要带jar-with-dependencies 结束的jar,如图所示
 
 如果使用 maven 编译,将依赖编译到jar包里面配置如下所示
<build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><mainClass>com.itsenlin.Helloworld</mainClass></manifest></archive></configuration><executions><execution><id>make-assembly</id> <!-- this is used for inheritance merges --><phase>package</phase> <!-- bind to the packaging phase --><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>
 
jmeter 使用 BeanShell 调用jar包中的签名方法
- 选择测试计划导航栏,配置扩展的jar

 - 配置BeanShell 预处理程序
路径 添加 -》前置处理器 -》BeanShellProcessor

BeanShell 的具体配置如下所示

使用扩展jar包中的签名算法 
import com.alibaba.fastjson.JSON;
import com.scd.sign.SignUtil;String inputParam = "{\n" +"  \"id\": 0,\n" +"  \"userName\": \"string\",\n" +"  \"password\": \"string\"\n" +"}";
String inputJson = JSON.parseObject(inputParam).toJSONString();
log.info("request json " + inputJson);
String timeStamp = String.valueOf(System.currentTimeMillis());
String appId = bsh.args[0];
String appKey = bsh.args[1];
String sign = SignUtil.generateBodySign(appId, appKey, timeStamp, inputJson);
vars.put("body", inputJson);
vars.put("appId", appId);
vars.put("timestamp", timeStamp);
vars.put("sign", sign);
 
vars 中存入了原始的请求参数,http的请求的body参数需要取vars中存入的数据 ${body}
 
 请求头中需要的数据 appId、timestamp、sign 也可以从 vars 中获取
 
 BeanShell 的用法可以查看 【jmeter】BeanShell用法详细汇总
 
- 配置接口响应断言
路径 添加 -》断音 -》JSON断言

 - 配置查看结果树
配置查看结果树之后才能查看请求的记录,配置路径 添加 -》监听器 -》查看结果树

 - 启动线程组验证

启动之后,可以在查看结果树查看请求记录

点击黄色的感叹号,可以查看运行的日志

 
