OpenFeign替代品:Spring6 新增的http exchange 如何设置拦截器

前言

OpenFeign已经被认为是功能完备了,后续不再更新新功能,新出来的 http exchange 可以实现类似的功能。
在使用Openfeign的时候,我们通常会使用它的拦截器来实现认证token的填写等统一处理,那么,在使用Http exchange的时候,该怎么实现类似的功能呢?

方案

先说结论,HTTP Exchange本身不具备设置拦截器的功能,但是,要使用Http exchange需要设置一个底层使用的client,通常会设置成RestClient或者RestTemplate,而RestClient或者RestTemplate是具备设置拦截器的功能的,所以,我们将拦截器设置到cliet上,再使用client生成HTTP Exchange的HttpServiceProxyFactory,就可以达成目标了。
下面以RestClient为例,演示一个设置认证token拦截器的功能。

首先,我们需要定义一个拦截器,RestClient支持多种拦截器,比如 请求发送前: ClientHttpRequestInitializer, 请求发送拦截器: ClientHttpRequestInterceptor等,具体可以查看 RestClient.Builder,里面有很多的拦截器可以设置。
我们的拦截器是在发送前将认证header添加到request上,代码如下:



import jakarta.annotation.Nonnull;
import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpRequestInitializer;
import org.springframework.stereotype.Component;



 // 注意,这里可以是bean的方式,用于后面的注入,也可以是直接new,没有限制。用bean的模式是为了方便使用其他的service
 @Component
public class MyRequestInterceptor implements ClientHttpRequestInitializer {

    @Override
    public void initialize(@Nonnull ClientHttpRequest request) {
    // 模拟获取token
        String token = "xxx";
        request.getHeaders().add("x-auth-token", token);
    }
}

然后,我们声明RestClientHttpServiceProxyFactory

/**
 * @author 
 */
@Configuration
public class HttpExchangeAutoConfig {

// 直接用 List<ClientHttpRequestInitializer> 自动注入了所有的拦截器,也可以自己去new一些,不用自动注入
    @Bean
    public HttpServiceProxyFactory httpServiceProxyFactory(RestTemplate restTemplate, @Autowired(required = false) List<ClientHttpRequestInitializer> requestInitializers) {
        // http client默认配置,需要更多配置就自己自定义。
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        var builder = RestClient.builder()
                .requestFactory(factory);
        for (ClientHttpRequestInitializer requestInitializer : requestInitializers) {
            builder.requestInitializer(requestInitializer);
        }

        RestClientAdapter adapter1 = RestClientAdapter.create(builder.build());
        return HttpServiceProxyFactory
                .builderFor(adapter1)
                .build();
    }
}

有了HttpServiceProxyFactory,后面我们就直接用它创建service的client并使用了:

@Resource
private HttpServiceProxyFactory factory;

xxxFunc(){
    XXXXApi xxxApi = factory.createClient(XXXXApi.class);
    xxxApi.xxx();
}
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值