Saltar al contenido

Spring RestTemplate intercambia POST HttpClientException con cualquier respuesta que no sea 200 OK

La guía o código que encontrarás en este artículo es la resolución más fácil y válida que encontramos a esta duda o dilema.

Solución:

El comportamiento predeterminado de RestTemplate al encontrar códigos de respuesta de error genera una excepción. En el caso de 4xx es HttpClientErrorException y en caso de 5xx: HttpServerErrorException (ambos extendidos HttpStatusCodeException). Spring logra eso usando ResponseErrorHandler (y su implementación predeterminada – DefaultResponseErrorHandler)

Una forma de manejar esto sería atraparlos:

try 
    ResponseEntity response = restTemplate.exchange(fruitBasketUrl, HttpMethod.POST, fruit, String.class);
 catch(HttpClientErrorException e) 
    //handle 4xx errors
 catch(HttpServerErrorException e) 
    //handle 5xx errors

Si necesita personalizar este comportamiento (algunas API de descanso usan esos códigos cuando envían respuestas legítimas a algunas solicitudes que luego puede querer procesar como lo hace con la respuesta 2xx), puede crear su propia implementación de ResponseErrorHandler implementándolo o extendiéndolo DefaultResponseHandler y luego registrando su controlador con RestTemplate durante su inicialización:

public class MyResponseErrorHandler extends DefaultResponseErrorHandler 

    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException 
        // check if response code is an error in here or just use default implementation
    

    @Override
    public void handleError(ClientHttpResponse response) throws IOException 
        // handle different response codes
        // (default spring behaviour is throwing an exception)
    

Y registrando:

RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new MyResponseErrorHandler());
// now RestTemplate's behaviour for error status codes is customized

No hay nada malo aquí. Esta excepción se lanzará si recibe un código de estado erróneo.

Solo necesita envolver su código del lado del cliente en un try-catch y captura la excepción y luego haz lo que quieras con ella.

try 
    ResponseEntity response = restTemplate.exchange(fruitBasketUrl, HttpMethod.POST, fruit, String.class);
 catch (HttpStatusCodeException e) 
    e.getMessage();

Comentarios y valoraciones

Te invitamos a favorecer nuestro trabajo añadiendo un comentario y puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *