通过Interceptor或HttpEntity将HTTP标头添加到RestTemplate?

问题描述 投票:0回答:1

如果我有一些静态标题应该应用于使用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);

哪一个优于另一个,因此应该优先考虑?

java spring resttemplate spring-web
1个回答
0
投票

1)HttpEntity在发送之前:对restTemplate进行细粒度控制。它工作但你必须在任何地方重复代码,开发人员可能会忘记它(干)

2)ClientHttpRequestInterceptorRestTemplateCustomizer:从restTemplateBuilder bean创建的每个restTemplate将具有此拦截器,适用于一般行为。

© www.soinside.com 2019 - 2024. All rights reserved.