我定义了一个Configuration类:
@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)
为了设置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);
}
}
那么你需要注册这个拦截器:
@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。