groovy 请求中的字符串格式问题列表

j91ykkif  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(192)

我正在尝试使用Jmeter的GraphQL HTTP请求对我的Graphql API进行负载测试。我正在JSR223预处理器中阅读CSV文件以创建ArrayList。我正在将ArrayList加载到参数中。当我使用参数值时,由于格式问题而出现错误。不使用参数进行查询

query MyQuery {
  batchGetData(input_data: ["aqwedasd","aqwedasq"]) {
    data {
      value1
      value2
      value3
    }
  }
}

不带参数的JMeter请求的主体。以下请求工作正常,没有任何问题。

POST https://example.com/graphql

POST data:
{"operationName":null,"query":"query MyQuery {\n  batchGetData(input_data: [\"aqwedasd\",\"aqwedasq\"]) {\n    data {\n      value1\n      value2\n      value3\n    }\n  }\n}"}

[no cookies]

现在使用JSR223预处理器,我读取了一个CSV文件,并使用下面的脚本创建了一个ArrayList,然后将其添加到listdata参数中。

def rows = new File("values.csv").readLines()
Collections.shuffle(rows)
ArrayList<String> listdata = new ArrayList<String>()
listdata  = rows.subList(0, 5)
vars.putObject("listdata", listdata)

现在,在我的查询中,我使用了上面的listdata参数。
GraphQL查询:

query MyQuery {
  batchGetData(input_data: ${listdata}) {
    data {
      value1
      value2
      value3
    }
  }
}

现在,当我运行线程组时,JMeter将查询转换为下面的请求主体,这会失败,因为它不像前面的请求那样有****。

POST https://example.com/graphql

POST data:
{"operationName":null,"query":"query MyQuery {\n  batchGetData(input_data: ["aqwedasd","aqwedasq"]) {\n    data {\n      value1\n      value2\n      value3\n    }\n  }\n}"}

[no cookies]

我收到上述请求的以下错误

{
  "errors" : [ {
    "message" : "Invalid JSON payload in GraphQLAuth POST request.",
    "errorType" : "MalformedHttpRequestException"
  } ]
}

如果我做错了什么请告诉我。

gdx19jrr

gdx19jrr1#

您需要从CSV文件中获取escape quotation marks
您正在发送:

(input_data: ["aqwedasd","aqwedasq"])

而且它必须

(input_data: [\"aqwedasd\",\"aqwedasq\"])

我的期望是,您需要执行类似以下的操作,而不是vars.putObject("listdata", listdata)

def json = new groovy.json.JsonBuilder(listdata).toString()
def escapedJson = org.apache.commons.text.StringEscapeUtils.escapeJson(json)
vars.put('listdata', escapedJson)

有关JMeter中的Groovy脚本的更多信息:Apache Groovy: What Is Groovy Used For?

相关问题