[英]Autowire outbound RestTemplate's HttpEntity with inbound request headers
[英]Add http headers to RestTemplate by Interceptor or HttpEntity?
如果我有一些静态标头应该应用于使用RestTemplate
发送的任何请求:应该如何添加这些标头?
在这个例子中,我总是想发送 http 标头accept=applicaton/json
。 (它也可以是任何其他标题,也可以是多个标题)。
1)发送前直接HttpEntity
:
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
ResponseEntity<Rsp> http = restTemplate.postForEntity(host, new HttpEntity<>(req, headers), type);
2) ClientHttpRequestInterceptor
:
class MyInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
request.getHeaders().set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
return execution.execute(request, body);
}
}
@Bean
public RestTemplateCustomizer customizer() {
return restTemplate -> restTemplate.getInterceptors().add(new MyInterceptor());
}
然后只是发布:
restTemplate.postForEntity(host, req, type);
哪一个比另一个有优势,因此应该被优先考虑?
选项 1 似乎有点难以维护,因为开发人员需要记住每次都这样做。 选项 2 会更好,我只会做以下更改:
你在哪里做
restTemplate.getInterceptors().add(new MyInterceptor())
我会做
List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
if (CollectionUtils.isEmpty(interceptors)) {
interceptors = new ArrayList<>();
}
interceptors.add(new MyInterceptor());
restTemplate.setInterceptors(interceptors);
这样您就可以初始化列表,以防它为空。
另外,要小心,因为有人可以为 bean 设置一个新的拦截器列表,然后丢失你的拦截器列表。
1)直接发送前的HttpEntity
:对restTemplate的细粒度控制。 它有效,但您必须到处重复代码,开发人员可能会忘记它(DRY)
2) ClientHttpRequestInterceptor
与RestTemplateCustomizer
:从restTemplateBuilder豆创建的每个restTemplate都会有这种拦截器,适于一般行为。
Java 8 Lambda 使用拦截器的方式
new RestTemplateBuilder().interceptors(
(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) -> {
request.getHeaders().set(AUTHORIZATION, token);
return execution.execute(request, body);
}
).build()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.