headers error java url http-status-codes resttemplate

java - error - ¿Cómo extraer el código de estado HTTP de la llamada RestTemplate a una URL?



resttemplate spring headers (3)

Utilice los RestTemplate#exchange(..) que devuelven ResponseEntity . Esto le da acceso a la línea de estado y los encabezados (y el cuerpo obviamente).

Estoy utilizando RestTemplate para hacer una llamada HTTP a nuestro servicio que devuelve una respuesta JSON simple. No necesito analizar ese JSON en absoluto. Solo necesito devolver lo que obtengo de ese servicio.

Así que estoy mapeando eso a String.class y devolviendo la JSON response real como una cadena.

RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject(url, String.class); return response;

Ahora la pregunta es:

Estoy tratando de extraer los HTTP Status codes después de presionar la URL. ¿Cómo puedo extraer el código de estado HTTP del código anterior? ¿Debo hacer algún cambio en eso de la forma en que lo hago actualmente?

Actualizar:-

Esto es lo que he intentado y también puedo recuperar la respuesta y el código de estado. Pero, ¿siempre tengo que configurar HttpHeaders y Entity HttpHeaders como a continuación, lo estoy haciendo?

RestTemplate restTemplate = new RestTemplate(); //and do I need this JSON media type for my use case? HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); //set my entity HttpEntity<Object> entity = new HttpEntity<Object>(headers); ResponseEntity<String> out = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); System.out.println(out.getBody()); System.out.println(out.getStatusCode());

Un par de preguntas: ¿Necesito tener MediaType.APPLICATION_JSON ya que estoy haciendo una llamada a url que devuelve una respuesta, puede devolver JSON o XML o una cadena simple.


Puede haber algunos casos de uso un poco más complicados en los que alguien pueda caer (como yo lo hice). Considera lo siguiente:

Admite un objeto de página para usarlo con RestTemplate y ParameterizedTypeReference :

RestPageResponse :

import java.util.ArrayList; import java.util.List; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; public class RestResponsePage<T> extends PageImpl<T>{ private static final long serialVersionUID = 3248189030448292002L; public RestResponsePage(List<T> content, Pageable pageable, long total) { super(content, pageable, total); } public RestResponsePage(List<T> content) { super(content); } public RestResponsePage() { super(new ArrayList<T>()); } }

El uso de ParameterizedTypeReference arrojará lo siguiente:

ParameterizedTypeReference<RestResponsePage<MyObject>> responseType = new ParameterizedTypeReference<RestResponsePage<MyObject>>() {}; HttpEntity<RestResponsePage<MyObject>> response = restTemplate.exchange(oauthUrl, HttpMethod.GET, entity, responseType);

Llamando a #exchange :

HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); HttpEntity<?> entity = new HttpEntity<>(headers); response = restTemplate.exchange("localhost:8080/example", HttpMethod.GET, entity, responseType);

Ahora esta es la parte difícil.

Intentar llamar al getStatusCode de getStatusCode será imposible porque el compilador, desafortunadamente, no conocerá el tipo de response "prevista".

Esto se debe a que los genéricos se implementan a través de borrado de tipo que elimina toda la información con respecto a los tipos genéricos durante la compilación (leer más - fuente)

((ResponseEntity<RestResponsePage<MyObject>>) response).getStatusCode()

En este caso, debe convertir explícitamente la variable a la clase deseada para obtener el statusCode (y / u otros atributos).


Si no quieres dejar la bonita abstracción alrededor de RestTemplate.get/postForObject... métodos detrás de mí y no me gusta jugar con las cosas RestTemplate.exchange... necesarias al usar RestTemplate.exchange... (Request- and ResponseEntity, HttpHeaders, etc.), hay otra opción para obtener acceso a los códigos HttpStatus.

Simplemente rodee el RestTemplate.get/postForObject... habitual RestTemplate.get/postForObject... con un try / catch para org.springframework.web.client.HttpClientErrorException y org.springframework.web.client.HttpServerErrorException , como en este ejemplo:

try { return restTemplate.postForObject("http://your.url.here", "YourRequestObjectForPostBodyHere", YourResponse.class); } catch (HttpClientErrorException | HttpServerErrorException httpClientOrServerExc) { if(HttpStatus.NOT_FOUND.equals(httpClientOrServerExc.getStatusCode())) { // your handling of "NOT FOUND" here // e.g. throw new RuntimeException("Your Error Message here", httpClientOrServerExc); } else { // your handling of other errors here }

La org.springframework.web.client.HttpServerErrorException se agrega aquí para los errores con un 50x .

Ahora puede reaccionar de manera simple a todos los códigos de estado que desee, excepto el apropiado, que coincida con su método HTTP, como GET y 200 , que no se tratará como excepción, ya que es el que corresponde. Pero esto debería ser sencillo, si está implementando / consumiendo servicios RESTful :)