Crear interceptor en RestTemplate

Interceptores en RestTemplate

Interceptores en RestTemplate


El uso del cliente Rest de Spring es muy habitual en arquitecturas de microservicios o cuando se llaman a otras aplicaciones. En esta entrada vamos a ver como podemos Crear un interceptor en RestTemplate mediante la incorporación de cabeceras a una petición rest.

¿Qué es RestTemplate?

RestTemplate es una clase proporcionada por Spring Boot que simplifica la realización de solicitudes HTTP a APIs REST externas. Proporciona una forma conveniente de interactuar con servicios RESTful al abstraer las complejidades de crear y administrar conexiones HTTP, manejar la serialización de solicitudes y respuestas y gestionar el manejo de errores. RestTemplate admite varios métodos HTTP como GET, POST, PUT, DELETE, etc., y permite personalizar encabezados, parámetros de consulta y cuerpos de solicitud/respuesta. Sin embargo, a partir de Spring 5, RestTemplate se encuentra en modo de mantenimiento y se recomienda WebClient para nuevos proyectos debido a su naturaleza no bloqueante y reactiva.

¿Qué es un interceptor en Programación?

Un interceptor en programación es un componente o mecanismo que permite capturar y manipular las solicitudes y respuestas en una aplicación. Actúa como un filtro o middleware entre el cliente y el servidor, interceptando las llamadas y realizando acciones adicionales antes o después de que se procesen.

En Spring nos permite aplicar interceptores para realizar tareas como Autenticación y Autorización, registro de solicitudes, añadir cabeceras, almacenamiento en cachés etc…

Crear un Interceptor para RestTemplate en Spring

Para crear un Interceptor, Spring nos proporciona la clase ClientHttpRequestInterceptor. Esta clase nos proporciona una interfaz para implementar.

Vamos a comenzar creando una clase que implementa ClientHttpRequestInterceptor

public class HeaderTraceInterceptor
  implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(
      HttpRequest request, 
      byte[] body, 
      ClientHttpRequestExecution execution) throws IOException {
 
        ClientHttpResponse response = execution.execute(request, body);
        response.getHeaders().add("Trace", "myTrace");
        return response;
    }
}

En el código anterior hemos añadido un interceptor para que cada vez que una petición de restTemplate se realiza añadimos una cabecera «Trace» con «myTrace» en la response.

Si por el contrario lo que queremos es añadir esa cabecera en la request con cada petición, podemos hacer lo siguiente:

public class HeaderTraceInterceptor
  implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(
      HttpRequest request, 
      byte[] body, 
      ClientHttpRequestExecution execution) throws IOException {
         request.getHeaders().set("trace", "myTrace");

		
	return execution.execute(request, body);
    }
}

Añadir el interceptor al RestTemplate

Una vez hemos creado nuestro HeaderTraceInterceptor tenemos que añadirlo a la configuración de RestTemplate.

@Configuration
public class RestClientConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        List<ClientHttpRequestInterceptor> interceptors
          = restTemplate.getInterceptors();
        if (CollectionUtils.isEmpty(interceptors)) {
            interceptors = new ArrayList<>();
        }
        interceptors.add(new HeaderTraceInterceptor());
        restTemplate.setInterceptors(interceptors);
        return restTemplate;
    }
}

Con la anterior configuración hemos añadido nuestro interceptor a la configuración de nuestro RestTemplate, para ello recuperamos los interceptores que pueda tener nuestro RestTemplate e incorporamos el nuestro

Conclusión

En esta entrada hemos visto como crear interceptor en RestTemplate de una manera bastante sencilla y fácil.

El uso de Interceptores en RestTemplate suele ser bastante necesario cuando estamos con temas de seguridad para poder propagar el contexto, o cuando queremos propagar una cabecera de trazabilidad. Por ejemplo algo parecido a lo que hace Sleuth.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!


Deja una respuesta

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