You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter中GraphQL请求变量传递时多余双引号问题排查

解决JMeter GraphQL请求中动态JSON数组变量被额外加引号的问题

问题根源

在GraphQL Variables中直接引用JMeter变量时,JMeter会默认将变量值视为字符串处理,导致原本的JSON数组被额外包裹双引号,破坏JSON结构引发请求失败。

正确处理方法

方法1:使用__evalVar函数解析原始值

不要直接写${ITEMS_ID_REQUEST},改用${__evalVar(ITEMS_ID_REQUEST)}。该函数会直接输出变量的原始JSON数组内容,而非将其当作字符串处理。

示例:
原Variables写法:

{
  "fields": "${ITEMS_ID_REQUEST}"
}

修改后:

{
  "fields": ${__evalVar(ITEMS_ID_REQUEST)}
}

注意此处__evalVar外层不需要加双引号,因为函数返回的就是合法的JSON数组。

方法2:在JSR223预处理器中构造完整Variables JSON

如果需要动态生成多个变量,更稳妥的方式是直接在预处理器里生成完整的Variables JSON字符串,再存入JMeter变量后引用。

示例Groovy代码:

// 生成动态fields数组
def itemIds = ["item_001", "item_002", "item_003"]
// 构造完整Variables结构
def variablesMap = [
    fields: itemIds,
    pageSize: 10
]
// 转换为JSON字符串并存入变量
def variablesJson = new groovy.json.JsonBuilder(variablesMap).toString()
vars.put("FULL_VARIABLES", variablesJson)

HTTP请求Body Data中引用:

{
  "query": "your_graphql_query_content",
  "variables": ${FULL_VARIABLES}
}

方法3:直接修改请求Body内容

在JSR223预处理器中直接替换请求Body里的占位符,完全绕过JMeter变量的字符串处理逻辑。

示例:
请求Body原始内容:

{
  "query": "...",
  "variables": {
    "fields": "PLACEHOLDER_FIELDS"
  }
}

JSR223预处理器代码:

def dynamicFields = ["id_1", "id_2", "id_3"]
def fieldsJson = new groovy.json.JsonBuilder(dynamicFields).toString()
// 获取原始请求Body
def originalBody = sampler.getArguments().getArgument(0).getValue()
// 替换占位符
def modifiedBody = originalBody.replace("PLACEHOLDER_FIELDS", fieldsJson)
// 设置修改后的Body
sampler.getArguments().getArgument(0).setValue(modifiedBody)

注意事项

  • 优先使用Groovy作为JSR223预处理器的语言,性能更优且JSON处理更便捷。
  • 可通过日志验证生成的JSON格式:log.info("Generated fields: " + fieldsJson),在JMeter日志中查看结果是否正确。

内容的提问来源于stack exchange,提问作者ValarDohaeris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:52:04