【问题标题】:How to configure RestTemplate to be used with different URLs and Response Entities?如何配置 RestTemplate 以与不同的 URL 和响应实体一起使用?
【发布时间】:2021-09-27 21:11:26
【问题描述】:

我这样定义了一个配置类:

@Configuration
public class RestTemplateConfiguration {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

上面的 bean 被不同的服务用来执行如下操作:

ResponseEntity<Cars> cars= restTemplate.exchange(
                                                     RequestEntity.get(new URI(url)).headers(headers).build(),
                                                    Cars.class);

ResponseEntity<CarDetail> savingAmountConsumed = restTemplate.exchange(
                                                            builder.buildAndExpand(uriVariable).toUri(),
                                                            HttpMethod.PUT,
                                                            requestEntity,
                                                            CarDetail.class);

对于每个服务,我定义了不同的 URI 变量 uriVariable 并始终定义相同的标头配置,如下所示:

HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

是否可以以不需要在不同服务中多次设置相同标头的方式重新配置 RestTemplate? (同样的问题适用于 URI)

【问题讨论】:

    标签: java spring-boot resttemplate


    【解决方案1】:

    要设置Accept 标头,您可以使用拦截器,如下所示:

    public class AcceptHeaderSetterInterceptor implements ClientHttpRequestInterceptor {
    
      @Override
      public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        HttpHeaders headers = request.getHeaders();
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        return execution.execute(request, body);
      }
    }
    

    那么你需要注册这个Interceptor:

    @Configuration
    public class Config {
    
      @Bean
      public RestTemplate restTemplate() {
          RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
          restTemplate.setInterceptors(Collections.singletonList(new AcceptHeaderSetterInterceptor()));
          return restTemplate;
      }
    }
    

    关于 URI,我不建议您这样做,因为使用相同的 RestTemplate 来调用不同的 URL 是很常见的。 Bearer Token 也是如此,因为我猜这确实取决于您调用的 URL。

    【讨论】:

    • 谢谢若昂!我刚刚遇到了拦截器的概念,并将其直接添加到我的配置类中。对于那些感兴趣的人,我在这里给出的第二个示例中使用了相同的方法:https://riptutorial.com/spring/example/24622/setting-headers-on-spring-resttemplate-request
    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2013-10-23
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    相关资源
    最近更新 更多