Quarkus响应式REST客户端异步获取token注入请求头的实现方案咨询
Quarkus RESTEasy Reactive 客户端异步注入Token解决方案
方案1:使用响应式客户端请求过滤器(最优解)
ClientHeadersFactory 为同步设计的遗留接口,仅适用于无IO操作的请求头生成场景。针对异步获取Token的需求,官方原生支持响应式客户端过滤器实现,无额外依赖、完全适配响应式线程模型。
实现步骤如下:
- 实现
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(); } }
- 给目标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
相关产品推荐
相关产品推荐

