如何参与动态http请求并对其进行加密,并使用Jmeter替换http请求内的结果

问题描述 投票:1回答:1

我是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调用值”。还有其他解决方法吗?

java api http encryption jmeter
1个回答
0
投票

如果要完全替换请求正文,可以考虑使用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以获得有关这些JsonSlurperJsonBuilder类的更多信息,以及Apache Groovy - Why and How You Should Use It文章以全面了解JMeter中Groovy脚本的全面概述

© www.soinside.com 2019 - 2024. All rights reserved.