HTTP get with headers using RestTemplate
Solution 1
The RestTemplate getForObject()
method does not support setting headers. The solution is to use the exchange()
method.
So instead of restTemplate.getForObject(url, String.class, param)
(which has no headers), use
HttpHeaders headers = new HttpHeaders();
headers.set("Header", "value");
headers.set("Other-Header", "othervalue");
...
HttpEntity<Void> requestEntity = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(
url, HttpMethod.GET, requestEntity, String.class, param);
Finally, use response.getBody()
to get your result.
This question is similar to this question.
Solution 2
Take a look at the JavaDoc for RestTemplate.
There is the corresponding getForObject
methods that are the HTTP GET equivalents of postForObject
, but they doesn't appear to fulfil your requirements of "GET with headers", as there is no way to specify headers on any of the calls.
Looking at the JavaDoc, no method that is HTTP GET specific allows you to also provide header information. There are alternatives though, one of which you have found and are using. The exchange
methods allow you to provide an HttpEntity
object representing the details of the request (including headers). The execute
methods allow you to specify a RequestCallback
from which you can add the headers upon its invocation.
Solution 3
The getForObject() method of RestTemplate does not support setting headers. you can use this
syntax
:
restTemplate.exchange(url endpoint, HttpMethod.GET,entity, params)
public List<Employee> getListofEmployee()
{
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<List<Employee>> response = restTemplate.exchange("http://hello-server/rest/employees",
HttpMethod.GET,entity, new ParameterizedTypeReference<List<Employee>>() {});
return response.getBody(); //this returns List of Employee
}
Comments
-
rasen58 over 2 years
How can I send a GET request using the Spring RestTemplate? Other questions have used POST, but I need to use GET. When I run this, the program continues to work, but it seems that the network is clogged because this is in an AsyncTask, and when I try to run another asynctask after I click on the button for this one, they won't work.
I tried doing
String url = "https://api.blah.com/2.0/search/cubes?w=jdfkl&whitespace=1"; MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); map.add("Bearer", accessToken); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //copied this from somewhere else, not sure what its for HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); HttpMessageConverter<String> stringConverter = new StringHttpMessageConverter(); FormHttpMessageConverter formConverter = new FormHttpMessageConverter(); List<HttpMessageConverter<?>> msgConverters = new ArrayList<HttpMessageConverter<?>>(); msgConverters.add(formConverter); msgConverters.add(new MappingJacksonHttpMessageConverter()); msgConverters.add(stringConverter); template.setMessageConverters(msgConverters); //SetSearchResponseData is my custom class to store the incoming JSON ResponseEntity<SetSearchResponseData> result = template.exchange(url, HttpMethod.GET, request, SetSearchResponseData.class); //If I was using post, i could have done SetSearchResponseDataresponse = restTemplate.postForObject(url, request, SetSearchResponseData.class);
-
rasen58 almost 11 yearsI have looked at it, and
getForObject
doesn't have a parameter that allows me to specify the headers -
nicholas.hauschild almost 11 yearsYou are correct, it appears that there is not a way to specify the headers. The JavaDoc is there for you though. What is it that doesn't work about your current code? It is hard to tell from your question.
-
rasen58 almost 11 yearsi don't know what's not working because there is no error, but its just not sending or getting the data
-
axd about 8 yearsor use
getForEntity()
, which offersgetHeaders()
andgetBody()
. -
Richard Neish about 8 years@axd getHeaders() will get the response headers, the question is how to set the request headers.
-
user7294900 almost 4 yearsChange from raw type to
HttpEntity<?> entity = new HttpEntity<Object>(headers)
-
Codi about 3 yearsHere's a more detailed document from more recent times with example code and all possible variations you may required (as well as deserializing to required response type): attacomsian.com/blog/…
-
Tristan over 2 years@user7294900 : better
HttpEntity<Void> requestEntity = new HttpEntity<>(headers);