在我们通过OpenFeign调用接口,在调用接口前,如果想在请求中添加一些header信息、打一些日志等操作如何做呢?OpenFeign为我们提供了请求拦截器RequestInterceptor,我们可以通过实现这个接口,完成自己的拦截器功能,并配置到指定的Feign客户端。

配置方式

1.@Configuration方式

  1. public class ProviderClientConfiguration {
  2. @Bean
  3. public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
  4. return new BasicAuthRequestInterceptor("gaoxi", "password");
  5. }
  6. }
  7. @FeignClient(name = "provider-nacos",contextId ="provider",
  8. fallbackFactory = ProviderClientFallbackFactory.class,
  9. configuration = ProviderClientConfiguration.class)
  10. public interface ProviderClient {
  11. @GetMapping("test")
  12. String test();
  13. }

服务提供方可以通过取header中的Basic字段获取

2.Yaml方式

这种方式我知道可以配置无参构造方法的拦截器,但是拦截器构造方法需要参数的话,这边我也不知道怎么去配置

  1. feign:
  2. client:
  3. config:
  4. default:
  5. loggerLevel: BASIC
  6. requestInterceptors:
  7. - com.gao.consumernacosdemotimeout.config.CustomInterceptor

自定义请求拦截器

  1. 自定义请求拦截器的话可以参考OpenFeign为我们实现好的一些拦截器`BasicAuthRequestInterceptor`,然后学着写一下就好。
  1. public class CustomInterceptor implements RequestInterceptor {
  2. private static final Logger logger = LoggerFactory.getLogger(CustomInterceptor.class);
  3. @Override
  4. public void apply(RequestTemplate template) {
  5. logger.info("自定义请求拦截器");
  6. template.header("name", "gaoxi");
  7. }
  8. }

然后配置一下即可

  1. feign:
  2. client:
  3. config:
  4. default:
  5. loggerLevel: BASIC
  6. requestInterceptors:
  7. - com.gao.consumernacosdemotimeout.config.CustomInterceptor
  8. 或者
  9. public class ProviderClientConfiguration {
  10. @Bean
  11. public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
  12. return new BasicAuthRequestInterceptor("gaoxi", "password");
  13. }
  14. @Bean
  15. public CustomInterceptor customInterceptor(){
  16. return new CustomInterceptor();
  17. }
  18. }

注意: 若@Configuration和yaml中都有配置的话,两者都可以被应用上