如何配置RestTemplate以用于不同的url和响应实体?



我定义了一个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。

相关内容

  • 没有找到相关文章

最新更新