SpringCloud服务之间Feign调用不会带上请求头header

🎀三种方式设置请求头


在Spring Cloud中,使用Feign进行服务之间的调用时,默认情况下是不会传递header的。如果需要传递header,可以通过以下几种方式实现:

🎁@RequestHeader


  1. 在Feign的接口方法上使用@RequestHeader注解,指定要传递的header参数。例如:
@FeignClient(name = "other-service")
public interface OtherServiceClient {

    @GetMapping("/api/some-resource")
    ResponseEntity<String> getSomeResource(@RequestHeader("Authorization") String token);
}

🎁@Bean RequestInterceptor


  1. 在Feign的配置类中配置RequestInterceptor,用于设置header。例如:
@Configuration
public class FeignClientConfig {

    public HttpServletRequest getRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }

    @Bean
    public RequestInterceptor requestInterceptor() {
        return template -> {
            template.header("platform", getRequest().getHeader("platform"));
        };
    }
}

🎁实现 RequestInterceptor


  1. 在Feign的配置文件中配置header。例如:
feign:
  client:
    config:
      default:
        loggerLevel: full
        requestInterceptors:
          - com.example.MyRequestInterceptor
public class MyRequestInterceptor implements RequestInterceptor {
  public HttpServletRequest getRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }
    @Override
    public void apply(RequestTemplate template) {
        template.header("platform", getRequest().getHeader("platform"));
    }
}

以上是三种常用的方式,根据具体的需求选择适合的方式即可。

### 使用Feign客户端传递自定义HTTP请求头 在微服务架构中,当使用Feign作为Web Service客户端时,可以通过多种方式向远程服务发送带有特定头部信息的HTTP请求。一种常见做法是在发起请求前利用拦截器机制动态地附加这些头部字段。 对于希望每次调用`MyFeignClient.getSomeData()`方法时都附带固定的header名称与值的情况,可以构建一个实现了`RequestInterceptor`接口的类——例如命名为`HeaderInterceptor`,在这个类里重写其唯一的抽象方法`apply(RequestTemplate template)`,并通过设置模板对象上的headers属性完成对欲添加项的操作[^1]: ```java import feign.RequestInterceptor; import feign.RequestTemplate; public class HeaderInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { template.header("headerName", "headerValue"); } } ``` 为了让上述逻辑生效,还需要确保此拦截器已被注册至应用程序上下文中;通常可以在启动类或者其他配置组件内通过Java Config形式注入该bean实例即可。 另外,在实际业务场景下可能更倾向于依据当前环境变量或是其他运行时期条件灵活决定要追加的具体键值对组合,则此时应当考虑借助于Spring框架所提供的依赖注入特性来简化此类操作。比如下面的例子展示了如何基于`@ConfigurationProperties`注解读取外部化配置文件里的参数并将其应用到待发送的数据包之中[^2]: ```yaml # application.yml or equivalent configuration file custom.headers: header-name: custom-value ``` ```java @Configuration @EnableConfigurationProperties(CustomHeaders.class) public class FeignConfig { private final CustomHeaders headers; public FeignConfig(CustomHeaders headers){ this.headers=headers; } @Bean public RequestInterceptor requestInterceptor() { return new RequestInterceptor() { @Override public void apply(RequestTemplate template) { Map<String, String> map = headers.asMap(); for (String key : map.keySet()) { template.header(key,map.get(key)); } } }; } } @Component @Data // Lombok annotation to generate getters and setters automatically. @ConfigurationProperties(prefix="custom.headers") class CustomHeaders extends HashMap<String,String>{}; ``` 除了全局性的解决方案外,针对单次API交互而言也可以直接采用`@RequestHeader`标注形参的方式来显式指明所需携带的内容。这使得开发者能够更加直观地控制每一次具体的RPC行为,并且保持良好的代码可读性和维护性[^3]。 #### 示例:结合`@RequestHeader`实现局部范围内的请求头定制 假设存在如下所示的服务消费端接口定义: ```java package com.example.demo.clients; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; @FeignClient(name = "example-service-client", url = "${service.url}") public interface ExampleServiceClient { @GetMapping("/api/data") ResponseEntity<DataResponseDTO> getData(@RequestHeader(value = "Custom-Header") String customHeaderValue); } ``` 这里的关键在于`getData`函数签名部分所使用的`@RequestHeader`修饰符及其后面的表达式,它表明每当有人尝试执行这个动作时都需要额外提供一个名为`Custom-Header`的字符串类型的输入参数用于填充即将发出的消息体之外的部分[^4]。 最后值得注意的是,在某些特殊场合下(如涉及跨域资源共享CORS策略、安全认证token传播等问题),可能会遇到即使按照常规手段设置了相应条目却仍然无法正常抵达目的地的现象。这时就需要深入探究整个网络传输路径上各个节点的行为模式,特别是像Zuul这样的路由代理层是否会对接收到的信息做进一步处理而导致原始意图失效的情形发生[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值