Jmeter自定义函数开发-------输入参数被分割
项目场景:
测试开发工程师自学之路:开发Jmeter自定义函数
问题描述
函数传参时:有一个参数是Json串,
本想着作为一个data参数使用的,但是setParameters自动给按 “,” 分隔存到数组里面了
@Overridepublic void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {Object[] values = parameters.toArray();orgCode = ((CompoundVariable) values[0]).execute();sign_algorithm = ((CompoundVariable) values[1]).execute();data = ((CompoundVariable) values[2]).execute();}
原因分析:
原因没找到,希望有大佬看到能评论下!!!
解决方案:
写了个循环把参数拼起来了
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {Object[] values = parameters.toArray();orgCode = ((CompoundVariable) values[0]).execute();sign_algorithm = ((CompoundVariable) values[1]).execute();data = ((CompoundVariable) values[2]).execute();for (int i = 3;i<values.length;i++){data = data +',' +((CompoundVariable) values[i]).execute();}}
获取签值的完整代码如下
"""
本函数最终实现的功能,SHA256withRSA加签 sign_algorithm = 0
和HmacSHA256加签 sign_algorithm = 1
"""
package org.apache.jmeter.functions;
import jdk.nashorn.internal.ir.debug.ASTWriter;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;public class GetSign extends AbstractFunction {//SHA256withRSAprivate static final String KEY_ALGORITHM = "RSA";private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";public static String signByPrivateKey(byte[] data, String privateKey) throws Exception {byte[] keyBytes = decryptBASE64(privateKey);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);// 生成私钥PrivateKey priKey = factory.generatePrivate(keySpec);// 用私钥对信息进行数字签名Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(priKey);signature.update(data);return encryptBASE64(signature.sign());}private static byte[] decryptBASE64(String data) {return Base64.decodeBase64(data);}private static String encryptBASE64(byte[] data) {return new String(Base64.encodeBase64(data));}//HmacSHA256private static String SHA256 = "HmacSHA256";public static String getSign(byte[] bytesToSign, String appSecret) {try {Mac hmacSha256 = Mac.getInstance(SHA256);byte[] keyBytes = appSecret.getBytes("UTF-8");hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, SHA256));return Hex.encodeHexString(hmacSha256.doFinal(bytesToSign)).toUpperCase();} catch (Exception e) {e.printStackTrace();}return "";}private static final String key = "__GetSign";public GetSign() {}public String authorizationCode = "yangoo2021";public String channelCode = "ERP";public String orgCode;public String sign;public String sign_algorithm;public String data;public String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIp9GnQ9928bY7QrZY/oLsz77ad8VkiwhuZCg4fNDv+84Ct1DE1P6oBbF72sTeon5lAycpjRxCxa8GURjkFdcW4/hlao1F1u+yHIyXdm+N4ScHUdr+aohHwJXfWdieZXSqanqGcpvFM9MSAdY4lnzAH/uLj3tSNnuTxvebchYCfxAgMBAAECgYA1iDhSmKVtsGOxAFlo8DIvEG8EH97miD4NAccAFnbmyibJBZy0weB+rzeVHOadTcEMXQPJKMSw9JIaL1gS0kEG7qCrZ3dweaNCFf3kwPzPW0U38Mow4E9s0/bjgDtNH0i8rh6bC//41l8vQ9NTHP1htWgIL96ylktuWJmQCb2ghQJBANpsfaau4e+iOOul3HOXjjEe5dpF92g8GiZXccZyouacFmyWq64gd4SQYmIoay+wzTN0e1MouVJdbEOeb5S7HoMCQQCiUDl5HmtZJs9TMMZyDkCXAf9ptkD/qnGYxhvNzlbd7siXCRxbbtxQXswHyJBbP3J+Vhx6VE36+76rH/WcnVV7AkEAnbg3ZxPi66GtDmO+8uzd7RRNjzZ0dxznGQaNjmmavYC6JIELyPmCtAN6NzzOYSp+kggrQRon75SsJ4uRMMmJNwJADom8/Bo7ZzrQqxTdUW3xXxUwuVk3rS6pChQEfYSTx0ER+mU4gwAE/7Xd9HyEYYfnS2WPG23dpjNSOqWcLDDzbQJAG3sF5FrzU4qQFBTMEdvUmTUt7UOybyV/j1YDuaO71jpgXV56drUeEEUPfkeIlcMHeiqdo83hNkyBk3f/xBEDVA==";public String appSecret = "JveElkIjoiQjEyMjMxMDAwMDAwO";private static List<String> args = new LinkedList<>();static {// args.add("privateKey:SHA256withRSAUtil需要");
// args.add("appSecret:HmacSHA256Util需要");
// args.add("channelCode");args.add("orgCode");
// args.add("authorizationCode");args.add("sign_algorithm");args.add("data");}@Overridepublic String execute(SampleResult previousResult, Sampler currentSampler) throws Exception {String sign = "";if (orgCode != null) {String requestStr1 = "{\"authorizationCode\":\"" + authorizationCode + "\"," +"\"channelCode\":\"" + channelCode + "\"," +"\"data\":\"" + new String(Base64.encodeBase64(data.getBytes("UTF-8"))) + "\"," +"\"orgCode\":\"" + orgCode + "\"," +"\"sign_algorithm\":\"" + sign_algorithm + "\"}";switch (sign_algorithm) {case "1":sign = getSign(requestStr1.getBytes(), "JveElkIjoiQjEyMjMxMDAwMDAwO");break;case "0":sign = signByPrivateKey(requestStr1.getBytes(), privateKey);break;default:}String reqStr1 = "{\n" +"\"orgCode\":\"" + orgCode + "\"," +"\"channelCode\":\"" + channelCode + "\"," +"\t\"authorizationCode\": \"" + authorizationCode + "\",\n" +"\t\"sign_algorithm\": \"" + sign_algorithm + "\",\n" +"\t\"sign\": \"" + new String(Base64.encodeBase64(sign.getBytes("UTF-8"))) + "\",\n" +"\"data\":\"" + new String(Base64.encodeBase64(data.getBytes("UTF-8"))) + "\"" +"}";return reqStr1;} else {String requestStr2 = "{\"authorizationCode\":\"" + authorizationCode + "\"," +"\"channelCode\":\"" + channelCode + "\"," +"\"data\":\"" + new String(Base64.encodeBase64(data.getBytes("UTF-8"))) + "\"," +"\"orgCode\":\"" + orgCode + "\"," +"\"sign_algorithm\":\"" + sign_algorithm + "\"}";switch (sign_algorithm) {case "1":sign = getSign(requestStr2.getBytes(), "JveElkIjoiQjEyMjMxMDAwMDAwO");break;case "0":sign = signByPrivateKey(requestStr2.getBytes(), privateKey);break;default:}String reqStr1 = "{\n" +"\"orgCode\":\"" + orgCode + "\"," +"\"channelCode\":\"" + channelCode + "\"," +"\t\"authorizationCode\": \"" + authorizationCode + "\",\n" +"\t\"sign_algorithm\": \"" + sign_algorithm + "\",\n" +"\t\"sign\": \"" + new String(Base64.encodeBase64(sign.getBytes("UTF-8"))) + "\",\n" +"\"data\":\"" + new String(Base64.encodeBase64(data.getBytes("UTF-8"))) + "\"" +"}";return reqStr1;}}@Overridepublic void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {Object[] values = parameters.toArray();
// privateKey = ((CompoundVariable) values[0]).execute();
// appSecret = ((CompoundVariable) values[1]).execute();
// channelCode = ((CompoundVariable) values[2]).execute();orgCode = ((CompoundVariable) values[0]).execute();
// authorizationCode = ((CompoundVariable) values[4]).execute();sign_algorithm = ((CompoundVariable) values[1]).execute();data = ((CompoundVariable) values[2]).execute();for (int i = 3;i<values.length;i++){data = data +',' +((CompoundVariable) values[i]).execute();}}@Overridepublic String getReferenceKey() {return key;}@Overridepublic List<String> getArgumentDesc() {return args;}
}
Jmeter自定义函数开发-------输入参数被分割相关推荐
- 自定义函数使用GridSearchCV参数寻优
自定义函数使用GridSearchCV参数寻优 GirdSearchCV and RandomizedSearchCV 自定义函数中使用GirdSearchCV GridSearchCV参数说明 Gr ...
- Jmeter自定义函数和引入外部文件的几种方法
1. Bean Shell简介 BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); Bean ...
- Jmeter自定义函数
Jmeter内置了一些常用的函数,在Jmeter->选项->函数助手对话框,但是测试过程中这些函数远远不够, 比如:对服务器返回的session信息MD5.Base64加密等,再上传给服务 ...
- Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法
函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...
- std输入参数太多matlab,错误使用函数,输入参数太多怎么解决
请各位大神帮帮忙,实在想不明白问题在哪.我想用二分法求零点,待求函数为HS(t)的调用函数.代码如下 主程序是这个: %二分法迭代求解思路 %初始化 clc cla clear all close a ...
- matlab错误使用cd输入参数太多,错误使用函数,输入参数太多怎么解决
请各位大神帮帮忙,实在想不明白问题在哪.我想用二分法求零点,待求函数为HS(t)的调用函数.代码如下 主程序是这个: %二分法迭代求解思路 %初始化 clc cla clear all close a ...
- python strptime函数_关于python:datetime.strptime不接受自定义函数传递的参数
我正在尝试创建一个可重用的def函数,以将熊猫数据框列中的儒略日期转换为格里高利风格的日期. 使用该函数时,出现TypeError:strptime()参数1必须是str,而不是Series. imp ...
- python--plt.hist函数的输入参数和返回值的解释
函数作用----绘制直方图 函数参数和返回值 n,bins,patches=matplotlib.pyplot.hist( x, bins=10, range=None, normed=False, ...
- VS直接调试可执行文件main函数.exe输入参数argc(项目--> 属性--> 调试--> 命令参数)
#include <stdio.h> using namespace std;int main(int argc, char** argv) {int i;printf("arg ...
最新文章
- 通过WMI获得硬盘和CPU的物理序列号(VB.net)
- 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”
- 数据库查询性能优化之利器—索引(二)
- PyTorch基础(七)----- torch.nn.AdaptiveAvgPool2d()方法
- 干货!Kaggle座头鲸识别落下帷幕,冠军方案解读
- 5绘制收银台程序_进来学知识了:实操之C/C++的绘制
- 核能版“水变油”登上Nature!谷歌7000万押注,MIT参与,被评争风加水汽车
- 【Luogu1363】幻想迷宫
- 太强了!这款轻量级中间件几行代码就搞定SpringBoot的分库分表问题
- POJ 1155 TELE 树形DP
- Samba 实现文件共享
- 【校招 --阶段一 操作系统基础】进程地址空间
- 利用多线程中线程休眠----sleep实现简单的计时器以及时钟功能
- 腾讯收入证明泄漏,税后250万,月均20万...
- CSS Cascading Style Sheet 级联样式表1
- SSD掉电保护也是一门艺术
- dau计算-预测日活
- PTA 排序(快速排序,基数排序)
- Cookie重名问题处理
- sqlite数据库下载安装和初步操作和所遇到的问题near sqlite3:syntax error