Spring RestTemplate将HttpHeader属性复制到RequestBody

时间:2018-10-25 13:03:39

标签: java spring resttemplate

我们的应用程序正在使用RestTemplate调用其他Rest服务,它是Spring Boot应用程序。我有一些要求,我需要将属性从http标头复制到请求正文。

手动进行操作会导致许多地方的更改。我正在寻找一种通用的解决方案,即,我可以扩展RestTemplate的功能并在整个应用程序中使用它。

有什么方法可以修改RestTemplate来达到我的要求。我已经通过HttpMessageConverter经历了各种可能性,我可以附加Json Property,但是正在寻找一种可以从Header复制它的方式。

如果我不清楚自己的要求,请告诉我,任何提示都将有所帮助。

1 个答案:

答案 0 :(得分:1)

您可以通过实现ClientHttpRequestInterceptor

来扩展RestTemplate的行为
public class RestTemplateHeaderModifierInterceptor
  implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(
      HttpRequest request, 
      byte[] body, 
      ClientHttpRequestExecution execution) throws IOException {

        ClientHttpResponse response = execution.execute(request, body);
        response.getHeaders().add("Foo", "bar");
        return response;
    }
}

@Configuration
public class RestClientConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        List<ClientHttpRequestInterceptor> interceptors
          = restTemplate.getInterceptors();
        if (CollectionUtils.isEmpty(interceptors)) {
            interceptors = new ArrayList<>();
        }
        interceptors.add(new RestTemplateHeaderModifierInterceptor());
        restTemplate.setInterceptors(interceptors);
        return restTemplate;
    }
}

Reference