設(shè)置Feign的Header信息(五種方式)
概述
在微服務(wù)間使用Feign進(jìn)行遠(yuǎn)程調(diào)用時(shí)需要在 header 中添加信息,那么 springcloud open feign 如何設(shè)置 header 呢?有5種方式可以設(shè)置請(qǐng)求頭信息:
在@RequestMapping注解里添加headers屬性
在方法參數(shù)前面添加@RequestHeader注解
在方法或者類上添加@Headers的注解
在方法參數(shù)前面添加@HeaderMap注解
實(shí)現(xiàn)RequestInterceptor接口
示例說(shuō)明
由于Feign是完全支持Spring MVC注解的, 所以推薦使用前兩種Feign設(shè)置header的方式, 即: Spring MVC中使用注解設(shè)置header.
1. 在@RequestMapping注解里添加headers屬性
在application.yml中配置
app.secret: appSecretVal
編寫(xiě)feignClient
@PostMapping(value ="/book/api", headers ={"Content-Type=application/json;charset=UTF-8","App-Secret=${app.secret}"})
voidsaveBook(@RequestBodyBookDto condition);
2. 在方法參數(shù)前面添加@RequestHeader注解
設(shè)置單個(gè)header屬性
@GetMapping(value ="/getStuDetail")
public StudentVo getStudentDetail(@RequestBodyStudentDto condition,@RequestHeader("Authorization")String token);
設(shè)置多個(gè)header屬性
@PostMapping(value ="/card")
public CardVo createCard(@RequestBodyCardDto condition,@RequestHeaderMultiValueMap<String,String> headers);
查看源碼 org.springframework.web.bind.annotation.RequestHeader 說(shuō)明: If the method parameter is Map<String, String>, MultiValueMap<String, String>, or HttpHeaders then the map is populated with all header names and values.
3. 在方法或者類上添加@Headers的注解
3.1使用feign自帶契約
@Configuration
public class Foo Configuration{
? ? @Bean
? ? public Contract feignContract(){
? ? returnnew feign.Contract.Default();
? ? }
}
FeignClient使用@RequestLine注解, 而未配置feign自帶契約Contract時(shí), @Headers不會(huì)起作用, 而且啟動(dòng)項(xiàng)目會(huì)報(bào)錯(cuò):
Method xxx not annotated with HTTP method type (ex. GET, POST)
查閱官方文檔,feign 默認(rèn)使用的是spring mvc 注解(就是RequestMapping 之類的) ,所以需要通過(guò)新增一個(gè)配置類來(lái)修改其契約 ,即可可以解決該問(wèn)題了。
@RequestLine is a core Feign annotation, but you are using the SpringCloud@FeignClientwhichusesSpring MVC annotations.
3.2配置@Headers注解
@FeignClient(url ="${user.api.url}", name ="user", configuration =FooConfiguration.class)
public interface UserFeignClient{
? ? @RequestLine("GET /simple/{id}")
? ? @Headers({"Content-Type: application/json;charset=UTF-8","Authorization: {token}"})
? ? public User findById(@Param("id")String id,@Param("token")String token);
}
使用@Param可以動(dòng)態(tài)配置Header屬性
網(wǎng)上很多在說(shuō) @Headers不起作用,其實(shí)@Headers注解沒(méi)有生效的原因是:官方的Contract沒(méi)有生效
4. 在方法參數(shù)前面添加@HeaderMap注解
4.1 使用feign自帶契約
同上
4.2 配置@HeaderMap注解
@FeignClient(url ="${user.api.url}", name ="user", configuration =FooConfiguration.class)
? ? publicinterfaceUserFeignClient{
? ? @RequestLine("GET /simple/{id}")
? ? publicUserfindById(@Param("id")String id,@HeaderMapHttpHeaders headers);
}
5. 實(shí)現(xiàn)RequestInterceptor接口
值得注意的一點(diǎn)是:如果FeignRequestInterceptor注入到spring容器的話就會(huì)全局生效, 就是說(shuō)即使在沒(méi)有指定configuration屬性的FeignClient該配置也會(huì)生效, 為什么呢?有興趣的請(qǐng)看源碼分析.
配置@Component或@Service 或 @Configuration 就可以將該配置注入spring容器中, 即可實(shí)現(xiàn)全局配置, 從而該項(xiàng)目中的所有FeignClient的feign接口都可以使用該配置.文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-718781.html
如果只想給指定FeignClient的feign接口使用該配置, 請(qǐng)勿將該類配置注入spring中.文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-718781.html
@Configuration
public class FeignRequestInterceptor implements RequestInterceptor{
? ? @Override
? ? public void apply(RequestTemplate template){
? ? template.header(HttpHeaders.AUTHORIZATION,"tokenVal");
? ? ? ? }
}
到了這里,關(guān)于OpenFeign設(shè)置header的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!