如何记录Quarkus类型安全GraphQL客户端发起的HTTP请求?
解决Quarkus类型安全GraphQL客户端的请求日志与代理配置问题
一、正确配置日志以捕获请求细节
你之前的日志配置未覆盖到实际处理HTTP请求的核心组件,调整为以下配置即可输出完整的请求/响应内容:
# 确保控制台日志处理器能输出TRACE级别的内容 quarkus.log.handler.console.level=TRACE # SmallRye GraphQL客户端核心日志 quarkus.log.category."io.smallrye.graphql.client".level=TRACE # Vertx实现的GraphQL客户端日志(负责实际HTTP发送) quarkus.log.category."io.smallrye.graphql.client.vertx".level=TRACE # Vertx HTTP客户端详细日志(包含请求头、响应体等) quarkus.log.category."io.vertx.core.http".level=TRACE # 你的客户端接口类日志(若有内部日志输出) quarkus.log.category."com.example.MyApi".level=TRACE # 开启Vertx HttpClient的活动日志(可选,增强请求细节) quarkus.smallrye-graphql-client."your-client-name".vertx.log-activity=true
注意:将
your-client-name替换为你在@GraphQLClient注解中指定的客户端名称,若未指定名称则用default替代。
二、配置代理以捕获出站请求
Quarkus类型安全GraphQL客户端基于Vertx HttpClient实现,系统属性http.proxyHost等不会生效,需通过Quarkus专属配置设置代理:
# 针对指定GraphQL客户端配置HTTP代理 quarkus.smallrye-graphql-client."your-client-name".vertx.proxy-host=localhost quarkus.smallrye-graphql-client."your-client-name".vertx.proxy-port=8080 # 若代理需要认证,添加以下配置 quarkus.smallrye-graphql-client."your-client-name".vertx.proxy-username=your-proxy-user quarkus.smallrye-graphql-client."your-client-name".vertx.proxy-password=your-proxy-pass # 允许所有请求通过代理(按需开启) quarkus.smallrye-graphql-client."your-client-name".vertx.proxy-options.match-all=true
配置完成后,mitmproxy或Requestly即可正常捕获GraphQL客户端发起的HTTP请求。
三、自定义拦截器直接记录请求
如果日志配置仍不满足需求,可实现SmallRye GraphQL客户端拦截器,手动记录请求和响应:
- 编写拦截器类:
import io.smallrye.graphql.client.GraphQLClientRequest; import io.smallrye.graphql.client.GraphQLClientResponse; import io.smallrye.graphql.client.interceptor.GraphQLClientRequestInterceptor; import jakarta.enterprise.context.ApplicationScoped; import org.jboss.logging.Logger; @ApplicationScoped public class GraphQLRequestLogger implements GraphQLClientRequestInterceptor { private static final Logger LOG = Logger.getLogger(GraphQLRequestLogger.class); @Override public void beforeSend(GraphQLClientRequest request) { LOG.info("=== GraphQL 请求详情 ==="); LOG.info("请求URL: " + request.getUrl()); LOG.info("请求Payload: " + request.getPayload()); request.getHeaders().forEach((key, value) -> LOG.info("请求头: " + key + "=" + value)); } @Override public void afterReceive(GraphQLClientRequest request, GraphQLClientResponse response) { LOG.info("=== GraphQL 响应详情 ==="); LOG.info("响应状态码: " + response.getStatus()); LOG.info("响应Payload: " + response.getPayload()); } }
- 绑定拦截器到客户端接口:
在你的com.example.MyApi接口上添加注解:
@GraphQLClient(name = "your-client-name") @RegisterGraphQLClientInterceptor(GraphQLRequestLogger.class) public interface MyApi { // 你的GraphQL方法定义 }
或者通过配置文件绑定:
quarkus.smallrye-graphql-client."your-client-name".interceptors=com.example.GraphQLRequestLogger
内容的提问来源于stack exchange,提问作者KG6ZVP
相关产品推荐
相关产品推荐

