JMeter Groovy脚本vars.get返回null 无法提取result到HTTP采样器请求体
问题根源与修复方法
1. 现有脚本的核心错误
- 错误1:在Groovy脚本中直接使用
${signature_value}这类JMeter变量引用语法,JSR223元件建议用vars.get()方法获取变量,避免缓存问题和取值异常 - 错误2:存储变量的写法错误:
vars.put("signature", vars.get(result))中,result是Groovy本地变量,不是JMeter全局变量,不需要用vars.get获取,直接传变量本身即可。
2. 修正后的完整Groovy脚本
// 正确获取JMeter已有变量 def signatureValue = vars.get("signature_value") def timestamp = vars.get("timestamp") def appClientSecret = vars.get("APP_CLIENT_SECRET") def signValue = "${signatureValue}.${timestamp}.${signatureValue}" log.info("待签名内容为:" + signValue) // 生成HmacSHA256签名 def signingKey = new javax.crypto.spec.SecretKeySpec(signValue.getBytes("UTF-8"),"HmacSHA256") def mac = javax.crypto.Mac.getInstance("HmacSHA256") mac.init(signingKey) def hmac = mac.doFinal(appClientSecret.getBytes("UTF-8")) def result = hmac.encodeBase64().toString() // 关键:将Groovy本地变量存入JMeter全局变量,自定义变量名为signature vars.put("signature", result) log.info("生成的签名为:" + vars.get("signature")) // 可通过日志确认签名是否生成正确
3. HTTP采样器调用方法
直接在HTTP请求体中使用${signature}即可引用生成的签名值,无需写复杂的Groovy函数调用。
注意事项
- 确保Groovy脚本所在的JSR223元件(如JSR223预处理程序)执行顺序在HTTP采样器之前,建议放在目标HTTP采样器的子节点
- 生成字节数组时指定编码为UTF-8,避免不同环境默认编码不一致导致签名校验失败
- 不要在JSR223元件中大量使用
${}格式的变量引用,会导致脚本无法缓存,性能下降同时可能出现取值异常
内容的提问来源于stack exchange,提问作者Kamesh Karan
相关产品推荐
相关产品推荐

