优雅配置spring cloud feign的header

本文介绍了如何在Spring Cloud Feign中优雅地配置header,包括静态header(如Content-Type)的直接设置,以及动态header(如token)的处理。动态header的处理方法包括添加拦截器配置和自定义FeignClient的方式,详细讲解了这两种方法的实现步骤,并提示在使用过程中可能遇到的细节问题。
部署运行你感兴趣的模型镜像

1. 综述

在使用声明式feignclient时,有些情况下会用到要添加header,比如token、cookie之类的信息,本人根据使用场景将header分为两类 :

  • 静态header,比如Content-Type之类的,请求一个接口的所有请求,它们的Content-Type都是一样的
  • 动态header,比如每个请求对应着不同的token信息,服务端需要通过不同的token进行校验,得到具体的用户信息

2. 静态header的处理方式

对于该类型的header,可以直接添加在注解的headers属性上,可以对每个接口指定不同的值。

    @RequestMapping(method = RequestMethod.POST, value = "/something",headers = {"Content-Type=application/x-www-form-urlencoded"})
    Integer myMethod(@RequestBody String s);

3. 动态header的处理方式

对于动态header是无法使用静态的方式的,每个请求对应的header值不一样,以下以token为例,总结两种解决方法

3.1 添加拦截器的配置

public class AuthorityConfig implements RequestInterceptor{
    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //添加token
        template.header(Constants.TOKEN, request.getHeader(token.getToken()));
    }
}

使用这种方式,在feignclient声明处指定configuration属性即可,如下:

@FeignClient(value = "client", url = domain, configuration = AuthorityConfig.class)

3.2 使用自定义FeignClient的方式

public MyFeignClient getClient(Client client, String token) {
        return Feign.builder().client(client)
                .encoder(new Encoder.Default())
                .decoder(new Decoder.Default())
                .requestInterceptor(template -> template.header("token", token))
                .target(MyFeignClient.class, "http://domain");
    }

如上,在配置类中添加该方法,在service中注入配置类,调用该方法即可产生自定义的client实例,进行http的调用。使用该方法不需要使用声明式client


在添加动态header时,不管是方式一还是方式二,都有一些细节问题,推荐查看feign踩坑系列
分享拙见,如有不完善或者什么问题,请指正~

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

Spring Cloud Feign 中,自定义 Bean 的配置通常涉及 Feign配置类,可以通过 `@FeignClient` 注解的 `configuration` 属性指定自定义配置类。这种配置方式优先级高于默认的 `FeignClientsConfiguration`。通过自定义配置类,可以定义 Feign 的 Contract、Decoder、Encoder、Logger、ErrorDecoder 等组件。 ### 自定义 Feign 配置类 以下是一个典型的自定义 Feign 配置类的实现: ```java @Configuration public class FeignConfiguration { /** * 使用 Feign 的原生注解,替换默认的 Spring MVC 注解解析方式 */ @Bean public Contract feignContract() { return new feign.Contract.Default(); } /** * 自定义错误解码器,用于处理服务调用失败的逻辑 */ @Bean public ErrorDecoder errorDecoder() { return new CustomFeignErrorDecoder(); } /** * 自定义日志记录器,启用 Feign 的详细日志输出 */ @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } /** * 自定义解码器,用于处理响应数据的解析 */ @Bean public Decoder feignDecoder() { return new GsonDecoder(); } /** * 自定义编码器,用于处理请求数据的序列化 */ @Bean public Encoder feignEncoder() { return new GsonEncoder(); } } ``` ### 在 Feign 客户端中使用自定义配置Feign 客户端接口中,通过 `@FeignClient` 注解指定自定义配置类: ```java @FeignClient(name = "service-provider", configuration = FeignConfiguration.class) public interface ServiceClient { @GetMapping("/api") String callApi(); } ``` ### 自定义 FeignHeader 在某些场景下,可能需要为 Feign 请求添加自定义的 Header。可以通过实现 `RequestInterceptor` 接口来实现: ```java @Component public class CustomFeignInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { template.header("X-Custom-Header", "CustomValue"); } } ``` 确保该拦截器被注册为 Spring Bean,以便 Feign 能够自动识别应用它。 ### 自定义 Feign 的 Contract 默认情况下,Feign 使用 `SpringMvcContract` 来解析接口上的注解。如果希望使用 Feign 原生的注解方式,可以在配置类中定义 `Contract` Bean: ```java @Bean public Contract feignContract() { return new feign.Contract.Default(); } ``` 这将替换默认的 `SpringMvcContract`,允许使用 Feign 原生的注解方式定义接口。 ### 总结 通过自定义配置类,可以灵活地调整 Feign 的行为,包括注解解析方式、日志级别、错误处理、编解码器等。这些配置可以通过 `@FeignClient` 注解的 `configuration` 属性应用到特定的 Feign 客户端接口上,从而实现更精细化的控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值