@FeignClient 情况下header的传递方法,RestTemplate情况下Header传递方法
今天因为要调用另一个服务,因为我们用的是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(); } }