首页 > 解决方案 > 如何使用jmeter中的json提取器从加密解密的响应中提取值

问题描述

我已经尝试过使用下面的代码,但它显示的原因是:

javax.script.ScriptException: java.lang.NullPointerException: Cannot invoke method getValue() on null object
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:324) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.16.jar:2.4.16]
    at javax.script.CompiledScript.eval(Unknown Source) ~[?:1.8.0_202]
    at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:223) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.extractor.JSR223PostProcessor.process(JSR223PostProcessor.java:44) [ApacheJMeter_components.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.runPostProcessors(JMeterThread.java:925) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:564) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:486) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:253) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_202]
Caused by: java.lang.NullPointerException: Cannot invoke method setValue() on null object
    at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:47) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:34) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.purestudy.encryption.Script77.run(Script77.groovy:32) ~[?:?]
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:321) ~[groovy-all-2.4.16.jar:2.4.16]
java.lang.NullPointerException: Cannot invoke method setValue() on null object

这是我已经实现的代码,但它只接受在 bodydata 中使用 jsr223 预处理器传递和加密的参数,但不能用于我们无法应用预处理器的参数&这是写的 jsr223 后处理器

 **String encryptedText= "${ENCRYPTEDResponseofprevREQ}";
   log.info(encryptedText);

   String decryptedText = new OpenSSLEncryptDecrypt().decrypt(encryptedText);
   log.info(decryptedText);

   ctx.getCurrentSampler().getArguments().getArgument(0).getValue(decryptedText);

   vars.put("variable",decryptedText);
   def my_var1 = vars.get("variable");
  
   log.info(my_var1);
   ctx.getCurrentSampler().getArguments().getArgument(0).setValue(my_var1);**

标签: jsonjmeterbase64decodejmeter-5.0

解决方案


这一行:

ctx.getCurrentSampler().getArguments().getArgument(0).getValue(decryptedText);

导致错误,因为ctx.getCurrentSampler().getArguments().getArgument(0)返回null并且您试图getValue()在 null 对象上调用函数。

演示:

在此处输入图像描述

在不知道您要达到的目标的情况下很难说如何解决问题,但是有两件事是显而易见的:

  1. 您的 HTTP 请求采样器没有参数 - 这就是您收到此错误的原因
  2. 没有这样的函数getValue(String),该函数getValue()不带参数

有关JMeter 中 Groovy 脚本的更多信息,请参阅Apache Groovy - 为什么以及如何使用它一文


推荐阅读