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);
Author: rasen58, 2013-05-28

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.

 69
Author: Richard Neish,
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.

 1
Author: nicholas.hauschild,
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