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
相关产品推荐
相关产品推荐

