Добавить заголовки http в RestTemplate от Interceptor или HttpEntity? - PullRequest
0 голосов
/ 03 апреля 2019

Если у меня есть несколько статических заголовков, которые следует применять к любому запросу, отправляемому с 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 Ответ

0 голосов
/ 03 апреля 2019

1) HttpEntity непосредственно перед отправкой: детальный контроль restTemplate.Это работает, но вы должны повторять код везде, и разработчик может забыть его (DRY)

2) ClientHttpRequestInterceptor с RestTemplateCustomizer: каждый restTemplate, созданный из bean-компонента restTemplateBuilder, будет иметь этот перехватчик, подходящий для общего поведения.

...