Feign设置全局header
Feign 调用接口是经常会忘header信息,再次介绍两种忘header里面添加信息的方式:
1.通过直接在请求上,或者在类上添加Headers的注解
@Headers({"Content-Type: application/json","Accept: application/json",Accept {contentType}})
@PostMapping(value = "/card-blank/batch-create")
Response batchCreateCard(@RequestBody CreateCardBlankDTO condition,@Param("contentType") String type);
使用{contentType} 可以传递动态header属性
2. 通过实现RequestInterceptor接口,完成对所有的Feign请求,设置Header
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
@Component
public class FeignInterceptor implements RequestInterceptor{
@Autowried
HttpServletRequest request;
public void apply(RequestTemplate requestTemplate){
// 获取request请求中的Header信息放到requestTemplate header里
requestTemplate.header("hotelId", "111111");
}
}
这种方式也可以设置请求的其他属性,很灵活的一种方式:
如果你想在每次远程调用中传入自定义的请求头的话,可以试试LoadBalancerRequestTransformer,通过它可以对原始请求进行一定的转换
@Configuration
public class LoadBalancerConfig {
@Bean
public LoadBalancerRequestTransformer transformer() {
return new LoadBalancerRequestTransformer() {
@Override
public HttpRequest transformRequest(HttpRequest request, ServiceInstance instance) {
return new HttpRequestWrapper(request) {
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.putAll(super.getHeaders());
headers.add("X-InstanceId", instance.getInstanceId());
return headers;
}
};
}
};
}
}
被调用端请求
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
public CommonResult<User> getUser(@PathVariable Long id) {
User user = userService.getUser(id);
LOGGER.info("根据id获取用户信息,用户名称为:{}", user.getUsername());
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
String instanceId = request.getHeader("X-InstanceId");
if (StrUtil.isNotEmpty(instanceId)) {
LOGGER.info("获取到自定义请求头:X-InstanceId={}", instanceId);
}
return new CommonResult<>(user);
}
}