@FeignClient 情况下header的传递方法,RestTemplate情况下Header传递方法

博客讲述在使用SpringCloud框架调用另一服务时,因对方服务有权限校验,需将token和设备ID放于Header中,可通过@RequestHeader注解实现。虽双方服务参数个数不同,但因参数放置位置不同(body和header),此方法可行,还提到可注入RestTemplate实现。

        今天因为要调用另一个服务,因为我们用的是SpringCloud框架,所以通过Fegin调用,正好另一方服务有权限校验,需要传递token和设备ID,这两个参数都需要放到Header中,

用 @RequestHeader 这个注解实现,可以看到下面两个服务的代码, 我的是三个参数,另一方服务是一个参数,实际上另一方服务接口方法所在的类上有个@IamPermissions注解,就是用来拦截用的,所以虽然参数个数不一致,但是@RequestHeader注解只是在Header里,我刚开始还挺迷惑的,事实上这样是可行的,一个是放在body里,一个是header里。

 

我的服务的代码:

@FeignClient("xxx-xxx-xxx")
public interface CompensationOrderService {

    /**
     * 下单
     * @param form
     * @return
     */
    @PostMapping(value = "/xxx-xxx-xxx/v1-0/xxx/xxxx")
    @ResponseBody
    Result addOrders(@Valid @RequestBody OrderForm form,
                             @RequestHeader(value = "X-CHJ-Token")String token,
                             @RequestHeader(value = "X-CHJ-Deviceid")String deviceid);

 

另一方服务接口代码:

    @ApiOperation("下订单")
    @PostMapping("/orders")
    @ApiResponses({
        @ApiResponse(code = MusicCode.MUSIC_VIP_PRODUCT_NOT_EXIST_CODE, message = MusicCode.MUSIC_VIP_PRODUCT_NOT_EXIST_DESC),
        @ApiResponse(code = MusicCode.MUSIC_VIP_ORDER_CODE_IS_REPEAT_CODE, message = MusicCode.MUSIC_VIP_ORDER_CODE_IS_REPEAT_DESC)}
    )
    public Result<String> addOrders(@Valid @RequestBody OrderForm form) {

 

      另一个是使用注入RestTemplate ,创建HttpHeaders 对象, 写入header信息,  调用  postForEntity即可

@Service
@AllArgsConstructor
public class DemoService {

    @Autowired
    private RestTemplate restTemplate;

    中间代码省略。。。。。。。。。。。 public SendVo sendMessage(){

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        headers.set("Authorization",send_token);
        headers.set("Accept","application/json");

        Map<String,Object> map = new HashMap<String, Object>(2);

        Map<String, Object> mapJson = new HashMap<String, Object>(7);
        mapJson.put("type","oa");
        mapJson.put("title","title,钉钉推送消息demo测试完成,哈哈哈");
        mapJson.put("content",",钉钉推送消息demo测试完成,content-哈哈哈");
        mapJson.put("link","https://www.lixiang.com");
        mapJson.put("userid","dongpengju|chenwei");
        mapJson.put("mobile","13522396988");
        mapJson.put("need_sso",true);
        mapJson.put("in_dingding",true);

        map.put("message",Arrays.asList(mapJson));
        map.put("source","umu");

        HttpEntity httpEntity = new HttpEntity(map,headers);

        ResponseEntity<SendVo> postForEntity = this.restTemplate.postForEntity(send_url,httpEntity, SendVo.class);
        return  postForEntity.getBody();
    }

}

 

转载于:https://www.cnblogs.com/fenglangjuxu/p/11055265.html

### 如何在Spring Cloud Feign客户端中设置自定义Header #### 方法一:通过`@RequestLine`或`@Headers`注解 OpenFeign 提供了原生的支持,可以通过 `@Headers` 注解直接为某个 Feign 接口的方法添加固定的 HTTP Header。这种方式适用于静态的 Header 设置。 ```java @FeignClient(name = "exampleService", url = "http://example.com") public interface ExampleClient { @Headers("Authorization: Bearer token") // 静态Header设置 @GetMapping("/api/resource") String getResource(); } ``` 上述代码展示了如何使用 `@Headers` 注解为特定方法添加固定值的 Header[^4]。 --- #### 方法二:动态设置Header 如果需要根据运行时条件动态设置 Header,则可以利用 `RequestInterceptor` 实现全局或者局部范围内的动态 Header 添加逻辑。 ##### 步骤说明 1. 创建一个实现 `RequestInterceptor` 接口的类。 2. 在该拦截器中修改请求头信息。 3. 将此拦截器注册到 Spring 容器中。 以下是具体代码示例: ```java import feign.RequestInterceptor; import feign.RequestTemplate; @Component public class CustomFeignInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { // 动态设置Header template.header("Custom-Header-Key", "DynamicHeaderValue"); template.header("Authorization", "Bearer " + getTokenFromSomewhere()); } private String getTokenFromSomewhere() { // 获取实际Token的逻辑 return "your-dynamic-token"; } } ``` 在此配置下,所有的 Feign 请求都会自动带上由 `apply()` 方法设定的 Headers[^2]。 --- #### 方法三:基于`@RequestMapping`注解的方式 对于某些场景,可能更倾向于使用标准的 Spring MVC 注解风格而非 OpenFeign 原生注解。此时可以直接依赖于 `@RequestParam`, `@RequestBody` 或者其他参数绑定机制间接传递 Header 数据。 例如,在服务间通信过程中,可以从当前上下文中提取必要的认证信息并注入目标系统的 Header 中: ```java @RestController public class MyController { @Autowired private RestTemplate restTemplate; @GetMapping("/proxy-call") public ResponseEntity<String> proxyCall(@RequestHeader("Authorization") String authHeader) { HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", authHeader); HttpEntity<Void> requestEntity = new HttpEntity<>(headers); return restTemplate.exchange( "http://target-service/api/data", HttpMethod.GET, requestEntity, String.class ); } } ``` 尽管这不是严格意义上的 Feign 解决方案,但在特殊需求下也是一种可行的选择[^1]。 --- #### 总结 以上介绍了三种主要方式用于解决在 Spring Cloud Feign 调用期间设置自定义 HTTP Header 的问题。推荐优先考虑 **方法二 (RequestInterceptor)** ,因为它既灵活又易于维护,特别适合跨多个 API 调用共享相同 Header 场景下的应用开发工作流。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值