如何配置 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。
我定义了这样的配置 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。