Reputation: 2050
I'm currently using an OAuth2RestOperations that extends the Spring RestTemplate and I would like to specify the content type header.
The only thing I've managed to do was to explicitly set my header during the request:
public String getResult() {
String result = myRestTemplate.exchange(uri, HttpMethod.GET, generateJsonHeader(), String.class).getBody();
}
private HttpEntity<String> generateJsonHeader() {
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
return new HttpEntity<>("parameters", headers);
}
But it would actually be great to be able to set that once and for all during the bean initialization, and directly use the getforObject method instead of exchange.
Upvotes: 23
Views: 42168
Reputation: 4667
Since Spring Boot 1.4 you can use the RestTemplateBuilder
RestTemplate restTemplate = new RestTemplateBuilder()
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build();
Upvotes: 15
Reputation: 7630
First you have to create request interceptor:
public class JsonMimeReqInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
headers.add("Accept", MediaType.APPLICATION_JSON);
return execution.execute(request, body);
}
}
... and then you have rest template creation code which uses above interceptor:
@Configuration
public class MyAppConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate template = new RestTemplate(clientHttpRequestFactory());
//magic happens below:
template.setInterceptors(Collections.singletonList(new JsonMimeReqInterceptor()));
return restTemplate;
}
}
You could subclass RestTemplate
if you were to have some other specialised or universal REST templates in your application.
Upvotes: 33
Reputation: 1344
If you're using Spring Boot, you can just
@Configuration
public class RestConfig {
@Bean
public RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList(new HttpHeaderInterceptor("Accept",
MediaType.APPLICATION_JSON.toString())));
return restTemplate;
}
}
Upvotes: 2