如何获取Spring GraphQL中HttpGraphQlClient发送的精确请求体
查看HttpGraphQlClient精确请求体的可行方案
方案1:给底层WebClient加请求拦截器(最可靠,无额外依赖)
HttpGraphQlClient底层基于WebClient发送请求,可通过添加请求过滤器直接读取最终序列化完成的请求体字节,注意要缓存请求体避免读取后无法正常发送:
// 导入需要的类 import java.nio.charset.StandardCharsets; import org.springframework.web.reactive.function.client.ClientRequest; // 在构造client时添加过滤器 Object response = httpGraphQlClient.mutate() .url(url) .headers(headers -> headers.addAll(httpEntity.getHeaders())) .webClient(webClientBuilder -> webClientBuilder.filter((request, next) -> { ClientRequest bufferedReq = ClientRequest.from(request) .body(request.body().map(buffer -> { // 读取原始请求体字节 byte[] bodyContent = new byte[buffer.readableByteCount()]; buffer.read(bodyContent); // 控制台打印精确请求体,和实际发送的内容完全一致 System.out.println("=== 精确请求体开始 ==="); System.out.println(new String(bodyContent, StandardCharsets.UTF_8)); System.out.println("=== 精确请求体结束 ==="); // 重写请求体,避免读取后缓冲区为空导致请求发送失败 return buffer.factory().wrap(bodyContent); })) .build(); return next.exchange(bufferedReq); })) .build() .document(documentStr) .retrieve("phoneContactability0") .toEntity(Object.class) .block();
运行代码后控制台打印的内容就是最终发往服务端的精确JSON,包含所有转义字符、字段、空值配置下的实际输出。
方案2:开启框架内置请求日志(零代码修改)
在项目的application.properties/application.yml中添加如下日志配置,框架会自动打印完整的请求详情:
# 开启GraphQL客户端调试日志 logging.level.org.springframework.graphql.client.HttpGraphQlClient=DEBUG # 开启WebClient全链路追踪日志,打印完整请求体、请求头 logging.level.org.springframework.web.reactive.function.client.ExchangeFunctions=TRACE
启动项目发起请求后,在日志输出中搜索HTTP POST对应的请求内容即可看到完整请求体。
方案3:本地临时端点抓包(100%还原真实请求)
如果上述方法拿到的内容仍然不确定,可以在本地启动一个临时HTTP接口,路径和目标GraphQL端点保持一致,接口逻辑仅做两件事:
- 打印收到的完整请求体原始字符串
- 返回固定的200响应避免client抛错
将HttpGraphQlClient的请求url临时改为本地临时端点地址,发起请求后接口收到的内容就是完全真实的请求字节,不存在任何框架层面的加工误差。
常见请求体和推测不一致的原因
- 若项目Jackson配置了
NON_NULL序列化策略,值为null的字段(比如推测的variables:null、默认的operationName:null)会被直接移除,不会出现在最终JSON中 - JSON字段序列化顺序可能和手写的顺序不一致,若PoP token签名校验包含字段顺序因子,顺序不匹配会直接导致校验失败
- 传入的GraphQL document中的换行、引号转义规则可能和手写的字符串存在细微差异
内容的提问来源于stack exchange,提问作者Wes
相关产品推荐
相关产品推荐

