繁体   English   中英

通过拦截器或 HttpEntity 将 http 标头添加到 RestTemplate?

[英]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) ClientHttpRequestInterceptorRestTemplateCustomizer :从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM