You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何记录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客户端拦截器,手动记录请求和响应:

  1. 编写拦截器类:
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());
    }
}
  1. 绑定拦截器到客户端接口:
    在你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:35:56