如何配置 RestTemplate 以与不同的 URL 和响应实体一起使用?

How to configure RestTemplate to be used with different URLs and Response Entities?

我定义了这样的配置 class:

@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 并且始终定义相同的 header 配置,如下所示:

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

是否可以重新配置 RestTemplate,这样我就不需要在不同的服务中多次设置相同的 header? (同样的问题适用于 URI)

为了设置 Accept header 您可以使用拦截器,如下所示:

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);
  }
}

然后你需要注册这个拦截器:

@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。