HTTP get con encabezados usando RestTemplate
¿Cómo puedo enviar una solicitud GET usando el Spring RestTemplate? Otras preguntas han usado POST, pero necesito usar GET. Cuando corro esto, el programa continúa funcionando, pero parece que la red está obstruida porque esto está en una AsyncTask, y cuando intento ejecutar otra asynctask después de hacer clic en el botón para esta, no funcionarán.
He intentado hacer
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);
2 answers
El método RestTemplate getForObject()
no admite la configuración de encabezados. La solución es utilizar el exchange()
método.
Así que en lugar de restTemplate.getForObject(url, String.class, param)
(que no tiene encabezados), use
HttpHeaders headers = new HttpHeaders();
headers.set("Header", "value");
headers.set("Other-Header", "othervalue");
...
HttpEntity entity = new HttpEntity(headers);
ResponseEntity<String> response = restTemplate.exchange(
url, HttpMethod.GET, entity, String.class, param);
Finalmente, use response.getBody()
para obtener su resultado.
Esta pregunta es similar a esta pregunta.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-07 21:36:49
Echa un vistazo a JavaDoc para RestTemplate.
Existe la correspondiente getForObject
métodos que son los equivalentes HTTP GET de postForObject
, pero no parecen cumplir con sus requisitos de "GET with headers", ya que no hay forma de especificar encabezados en ninguna de las llamadas.
Mirando el JavaDoc, ningún método que sea específico de HTTP GET le permite también proporcionar información de encabezado. Sin embargo, hay alternativas, una de las cuales ha encontrado y está utilizando. Los métodos exchange
le permiten proporcionar un objeto HttpEntity
que representa los detalles de la solicitud (incluidos los encabezados). Los métodos execute
le permiten especificar un RequestCallback
desde el que puede agregar los encabezados a su invocación.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-15 14:46:43