首页 > 解决方案 > 如何参与动态http请求并对其进行加密并使用Jmeter替换http请求中的结果

问题描述

我是 jmeter 的新手。我有一个动态 http 请求,其中某些值取决于前一个 http 请求的值。还有一个 encryptedKey 和 value。该值是根据动态的详细信息对象计算得出的。我正在编写一个 java 函数来加密部分动态请求。encryptedValue 必须替换为 java 函数的结果。动态 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 对象并在其上应用 encrypt util。然后我必须用java函数的结果替换“EncryptedValue”,然后发出http请求。我如何在 jmeter 中做到这一点?

到目前为止我尝试过的:-

目前我正在将详细信息对象加载到一个单独的文件中,并使用 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 调用值”。有没有其他方法可以解决这个问题?

标签: javaapihttpencryptionjmeter

解决方案


如果要完全替换请求正文,可以考虑使用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()函数以将密钥作为参数,而不是从文件系统中读取它。

在上面的代码示例sampler中,代表HTTPSamplerProxy类,请参阅 JavaDoc 了解所有可用功能。

另请查看Apache Groovy:解析和生成 JSON,了解有关这些JsonSlurperJsonBuilder类的更多信息,以及Apache Groovy - Why and How You Should Use It一文,全面概述 JMeter 中的 Groovy 脚本


推荐阅读