Spring Boot 3.3.1使用HttpSyncGraphQlClient发请求报Error 400 [no body]
排查HttpSyncGraphQlClient发送请求时的400 Bad Request问题
针对你遇到的问题,可以从以下几个方向逐一排查:
开启详细日志,对比实际请求内容
开启Spring GraphQL客户端和RestClient的DEBUG日志,查看实际发送的请求体、请求头,和之前手动构建请求的内容做对比,确认是否存在差异。
在application.yml中添加日志配置:logging: level: org.springframework.graphql.client: DEBUG org.springframework.web.client.RestClient: DEBUG或者在RestClient构建时添加请求拦截器打印请求细节:
this.restClient = RestClient.builder() .requestInterceptor((request, body, execution) -> { System.out.println("Request Headers: " + request.getHeaders()); if (body != null) { System.out.println("Request Body: " + new String((byte[]) body, StandardCharsets.UTF_8)); } return execution.execute(request, body); }) .build();检查
retrieveSync的参数是否正确retrieveSync方法的参数是要从GraphQL响应data字段中提取的目标字段名,而非文档名。比如你的GraphQL查询如下:query myRequest($id: ID!) { user(id: $id) { name email } }那么
retrieveSync应该传入"user",而不是"myRequest"。参数错误会导致客户端解析响应失败,或触发服务端的结构校验错误。验证请求头的传递有效性
虽然你通过RequestContextHolder获取请求头,但要注意:- 部分头(如
Content-Type、Content-Length)可能被HttpSyncGraphQlClient自动覆盖,需确认服务端接受的Content-Type是否为application/json - 确保当前线程存在有效的请求上下文(比如非Web线程调用时
RequestContextHolder可能拿不到头)
对比日志中实际发送的请求头和之前手动请求的头,排查是否有缺失或错误的字段。
- 部分头(如
检查变量的序列化匹配度
HttpSyncGraphQlClient默认用Jackson序列化变量,需确认变量的JSON结构和服务端预期一致。可以打印变量的JSON字符串,和手动请求时的变量做对比:ObjectMapper mapper = new ObjectMapper(); System.out.println("Serialized Variables: " + mapper.writeValueAsString(variables));重点检查日期类型、嵌套对象的序列化格式是否符合服务端要求。
校验GraphQL文档的变量定义
确认文档中的变量名、类型和你传入的variables完全匹配。比如文档中定义的变量是$userId: ID!,但你传入的变量键是"id",会导致服务端参数校验失败,返回400错误。
内容的提问来源于stack exchange,提问作者Ebad
相关产品推荐
相关产品推荐

