如果我有一些静态标题应该应用于使用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)HttpEntity
在发送之前:对restTemplate进行细粒度控制。它工作但你必须在任何地方重复代码,开发人员可能会忘记它(干)
2)ClientHttpRequestInterceptor
与RestTemplateCustomizer
:从restTemplateBuilder bean创建的每个restTemplate将具有此拦截器,适用于一般行为。