Gatling发送携带GraphQL mutation的Post请求返回400如何解决?
400错误核心原因为GraphQL请求的JSON结构不符合服务端要求,常见错误包括:请求体漏外层JSON结构、query内容里的特殊字符未转义、变量格式非法。以下是正确实现方式:
方案1:使用ElFileBody(最推荐,无需手动处理转义)
该方案适合参数动态变化的场景,Gatling会自动处理占位符替换和格式转义,出错概率最低。
- 首先在
src/gatling/resources/graphql目录下新建sample.json,严格按照以下结构编写:
{ "query": "mutation 你的Mutation名($参数名: 参数类型!) {\n 调用的mutation方法(参数名: $参数名) {\n 返回字段1\n 返回字段2\n }\n}", "variables": { "参数名": "${动态参数占位符}" }, "operationName": "你的Mutation名" }
注意:不要直接把mutation字符串放在文件里,必须套上外层包含query的JSON结构。
- Gatling代码写法:
val testAPIScenario = scenario("GraphQL Mutation测试") // 如果有动态参数可以接数据源,没有可删除下行 .feed(csv("你的参数数据源.csv").circular) .exec( http("GraphQL接口调用") .post("https://demo.com/你的接口路径") // 路径直接写resources下的相对路径即可 .body(ElFileBody("graphql/sample.json")).asJson .check(status.is(200)) )
方案2:使用StringBody手动拼接
如果需要动态生成mutation内容,用Scala三引号避免手动转义双引号,同时补全JSON结构:
val testAPIScenario = scenario("GraphQL Mutation测试") .exec( http("GraphQL接口调用") .post("https://demo.com/你的接口路径") .body(StringBody( s"""{ "query": "${getMutation().replace("\"", "\\\"").replace("\n", "\\n")}", "variables": ${getVariables()} }""" )).asJson .check(status.is(200)) )
注意:必须对mutation内容里的双引号、换行做转义,getVariables()返回的必须是合法JSON字符串,不能有语法错误。
调试方法
如果仍返回400,添加日志打印实际请求和返回内容,根据服务端返回的具体错误提示调整:
val testAPIScenario = scenario("GraphQL Mutation测试") .exec( http("GraphQL接口调用") .post("https://demo.com/你的接口路径") .body(ElFileBody("graphql/sample.json")).asJson .check(status.saveAs("httpStatus")) .check(bodyString.saveAs("responseBody")) ) .exec { session => println(s"返回状态码:${session("httpStatus").as[Int]}") println(s"返回内容:${session("responseBody").as[String]}") session }
内容的提问来源于stack exchange,提问作者sourabh.gangoli
相关产品推荐
相关产品推荐

