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版本支持jdk1.8编译的扩展jar,之前用jdk17编译出来的扩展jar包,不能运行签名算法,后面改成使用jdk1.8编译的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断言
- 配置查看结果树
配置查看结果树之后才能查看请求的记录,配置路径 添加 -》监听器 -》查看结果树
- 启动线程组验证
启动之后,可以在查看结果树查看请求记录
点击黄色的感叹号,可以查看运行的日志