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

Quarkus响应式REST客户端异步获取token注入请求头的实现方案咨询

Quarkus RESTEasy Reactive 客户端异步注入Token解决方案

方案1:使用响应式客户端请求过滤器(最优解)

ClientHeadersFactory 为同步设计的遗留接口,仅适用于无IO操作的请求头生成场景。针对异步获取Token的需求,官方原生支持响应式客户端过滤器实现,无额外依赖、完全适配响应式线程模型。
实现步骤如下:

  1. 实现ResteasyReactiveClientRequestFilter接口,该接口的filter方法支持返回Uni<Void>类型的异步结果
import org.jboss.resteasy.reactive.client.spi.ResteasyReactiveClientRequestContext;
import org.jboss.resteasy.reactive.client.spi.ResteasyReactiveClientRequestFilter;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.ws.rs.ext.Provider;
import org.eclipse.microprofile.rest.client.inject.RestClient;

@Provider
@ApplicationScoped
public class AsyncTokenAuthFilter implements ResteasyReactiveClientRequestFilter {

    // 注入用来获取Token的异步REST客户端
    @RestClient
    TokenService tokenService;

    @Override
    public Uni<Void> filter(ResteasyReactiveClientRequestContext requestContext) {
        // 异步获取Token后注入到请求头
        return tokenService.getToken()
                .invoke(token -> requestContext.getHeaders().add("Authorization", "Bearer " + token.getTokenValue()))
                .replaceWithVoid();
    }
}
  1. 给目标REST Client接口注册该过滤器
import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

@RegisterRestClient
@RegisterProvider(AsyncTokenAuthFilter.class)
public interface YourBusinessRestClient {
    // 原有接口方法无需修改
    Uni<YourResult> callTargetApi(YourParam param);
}

方案2:上层业务逻辑手动传递Token

如果Token获取逻辑和业务场景绑定较强、不需要全局复用,可以在上层调用前先异步获取Token,通过@HeaderParam传递给客户端接口:

// 上层业务代码
@Inject
@RestClient
YourBusinessRestClient businessClient;

@Inject
TokenService tokenService;

public Uni<YourResult> executeBusiness() {
    return tokenService.getToken()
            .chain(token -> businessClient.callTargetApi("Bearer " + token.getTokenValue(), businessParam));
}

// 对应客户端接口调整
@RegisterRestClient
public interface YourBusinessRestClient {
    Uni<YourResult> callTargetApi(@HeaderParam("Authorization") String authHeader, YourParam param);
}

注意事项

如果Token有有效期,建议在Token获取逻辑中添加本地缓存,可使用Quarkus自带的@CacheResult注解或者Mutiny的CachingUni实现,避免每次请求都重复调用Token接口,降低服务开销。


内容的提问来源于stack exchange,提问作者AmsterdamLuis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:57:03