我是jmeter的新手。我有一个动态的http请求,其中某些值取决于上一个http请求的值。也有一个cryptoKey和值。该值是基于动态的详细信息对象计算的。我正在编写一个Java函数来加密动态请求的一部分。必须使用java函数的结果替换cryptomatedValue。动态Http请求:-
{
"ver": "1.0",
"timestamp":"2019-08-28T11:39:57.153Z",
"Details": {
"key": "Previous API call value",
"key": "Previous API call value"
},
"EncryptedKey": "EncryptedValue"
}
我只需要获取Details对象,然后在其上应用crypto util。然后,我必须用java函数的结果替换“ EncryptedValue”,然后发出http请求。我该如何在jmeter中做到这一点?
到目前为止我尝试过的:-
目前,我正在将details对象加载到一个单独的文件中,并使用java对其进行读取并对其进行加密。
所以我最终的http请求如下:-
{
"ver": "1.0",
"timestamp":"2019-08-28T11:39:57.153Z",
"Details": {
"key": "Previous API call value",
"key": "Previous API call value"
},
"EncryptedKey": "${__groovy(new com.util.Encryption().encryptData(), encryptedValue)}"
}
但是,这不能用先前的http请求的结果替换“先前的API调用值”。还有其他解决方法吗?
如果要完全替换请求正文,可以考虑使用JSR223 PreProcessor并使用类似以下代码:
免责声明:由于您的示例请求数据不是有效的JSON,并且我不知道您的Encryption().encryptData()
函数是如何实现的,因此我无法保证下面的代码将正常工作
def requestBody = new groovy.json.JsonSlurper().parseText(sampler.getArguments().getArgument(0).getValue())
def key = requestBody.Details.key
requestBody.EncryptedKey = new com.util.Encryption().encryptData(key)
def arguments = new org.apache.jmeter.config.Arguments()
sampler.setArguments(arguments)
sampler.addNonEncodedArgument('', new groovy.json.JsonBuilder(requestBody).toPrettyString(),'')
sampler.setPostBodyRaw(true)
但是您必须重写com.util.Encryption().encryptData()
函数以将key作为参数,而不是从文件系统中读取它。
在以上代码示例中,sampler
代表HTTPSamplerProxy类,有关所有可用功能,请参见JavaDoc。
也请查阅Apache Groovy: Parsing and producing JSON以获得有关这些JsonSlurper和JsonBuilder类的更多信息,以及Apache Groovy - Why and How You Should Use It文章以全面了解JMeter中Groovy脚本的全面概述