JMeter使用__FileToString设置GraphQL请求体报JSON无效问题
问题说明
(本示例为基于SWAPI的演示案例)
测试过程中通过读取文件内容设置GraphQL请求体时,会收到JSON格式无效报错;但将完全相同的内容手动填入请求体后,请求可正常发送。在查看结果树中对比两类请求发现,二者唯一差异为手动设置的请求体经过转义处理,换行符以\n形式存在而非可视化换行。
- 读取文件内容作为请求体的失败请求相关截图:


- 手动填入请求体的成功请求相关截图:


核心诉求:从文件读取查询字符串设置请求体时,如何强制实现上述换行符转义效果。
解决方法
问题本质是JSON规范不允许字符串值中出现未转义的实际换行符,手动输入请求体时JMeter的HTTP组件会自动完成特殊字符转义,但直接传入读取文件得到的变量时,不会触发这个自动转义逻辑,用下面任意一种方法都能解决:
- JSR223预处理程序转义(最稳定)
在对应HTTP请求前新增JSR223 PreProcessor,选择Groovy作为脚本语言(不要选BeanShell,性能差很多),写入如下代码:
请求体里对应query字段的值直接写// 如果你已经把文件内容读到变量里了,就把下面的文件读取逻辑换成 vars.get("你存原始内容的变量名") String rawContent = new File("你的GraphQL查询文件绝对/相对路径").text // 依次转义JSON字符串需要处理的特殊字符 String escapedContent = rawContent.replace("\\", "\\\\") .replace("\"", "\\\"") .replace("\r", "\\r") .replace("\n", "\\n") .replace("\t", "\\t") // 转义后的值存入变量,后续请求体直接引用即可 vars.put("escaped_graphql_query", escapedContent)"${escaped_graphql_query}"就可以正常发送。 - 内置函数快速替换
不想写脚本的话,直接用JMeter自带的字符串替换函数组合文件读取函数,一步完成转义:
注意函数第二个参数位置直接敲一个实际换行,不要填其他内容,第三个参数填${__strReplace(${__FileToString(你的查询文件路径,UTF-8,)}, ,\n,target_query)}\n,最终生成的target_query变量就是转义完成的内容。如果查询里有双引号、制表符,多套一层__strReplace处理对应字符即可。 - 使用GraphQL专用插件
高频测试GraphQL接口的话,直接安装JMeter官方插件库中的GraphQL插件,插件会自动处理查询语句的格式转义,只需要指定查询文件路径,不需要手动做任何字符处理。
避坑提示:不要尝试直接修改请求头绕开JSON格式校验,所有标准GraphQL服务端都会按JSON规范解析请求体,未转义的控制字符一定会被拦截。
内容的提问来源于stack exchange,提问作者Mateus Dadalto
相关产品推荐
相关产品推荐

