Spring RestTemplate经常被用作客户端向Restful API发送各种请求,也许你也碰到过这种需求,很多请求都需要用到相似或者相同的Http Header。如果在每次请求之前都把Header填入HttpEntity/RequestEntity,这样的代码会显得十分冗余。
对restTemplate 不熟悉的可以看我的这篇文章 :详解 RestTemplate 操作
Spring提供了ClientHttpRequestInterceptor接口,可以对请求进行拦截,并在其被发送至服务端之前修改请求或是增强相应的信息。
首先,我们自定义一个拦截器 UserContextInterceptor
public class UserContextInterceptor implements ClientHttpRequestInterceptor {
private static final Logger logger = LoggerFactory.getLogger(UserContextInterceptor.class);
@Override
public ClientHttpResponse intercept(
HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
HttpHeaders headers = request.getHeaders();
headers.add("test", "我是拦截器添加的请求头");
return execution.execute(request, body);
}
}
这个拦截器的作用很简单,就是往请求头里面添加一个信息。
接下来要想对RestTemplate起作用,还需要一些配置:我们需要定义一个 restTemplate bean,然后,把上面我们自定义的拦截器给添加进去。
@LoadBalanced
@Bean
public RestTemplate getRestTemplate(){
RestTemplate template = new RestTemplate();
List interceptors = template.getInterceptors();
if (interceptors==null){
template.setInterceptors(Collections.singletonList(new UserContextInterceptor()));
}
else{
interceptors.add(new UserContextInterceptor());
template.setInterceptors(interceptors);
}
return template;
}
有了这个bean定义,每当使用 @Autowrited注解将 RestTemplate 注入一个类,就会使请求头中添加一个test的信息。