En este artículo veremos qué es WebClient, cómo surge en alternativa a Rest Template y cómo usarlo.
WebClient dentro de Spring es una alternativa no bloqueante a restTemplate. Forma parte del proyecto WebFlux para el desarrollo de aplicaciones web reactivas.
Permite consumir otros servicios web de forma asincrónica, usando un API fluent y una abstracción sobre diversos clientes http, esto nos facilita el desarrollo de nuestras aplicaciones al no tener que conocer interfaces específicas de cada cliente. Por defecto la implementación de cliente http que utiliza es Reactor Netty.
Ventajas sobre RestTemplate
Como principal ventaja que podemos destacar es que permite consumir servicios de forma reactiva abriendo las posibilidades de desarrollo de nuestras aplicaciones de forma no bloqueante.
Adicionalmente, nos permite configurar los clientes que vamos a utilizar usando un api fluent que facilita la legibilidad de nuestra configuración.
¿Cómo lo uso?
Para poder hacer uso de este cliente en nuestra aplicación de Spring Boot necesitaremos de las siguientes dependencias:
Spring WebFLux
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webflux</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
Spring Project Reactor (Para poder utilizar la implementación por defecto del cliente http)
<dependency>
<groupId>org.projectreactor</groupId>
<artifactId>reactor-spring</artifactId>
<version>1.0.1.RELEASE</version>
</dependency>
Una forma sencilla de utilizar webclient es usando el builder con el que viene implementado, hay que tener en cuenta que el mismo no es thread safe por lo que se recomienda utilizar el bean que autoconfigura spring boot el cual tiene un scope de tipo prototype. Esto nos garantiza que se inyecte una nueva instancia por cada componente que lo requiera:
@Repository
public class ProvinciaRepository{
private final WebClient webClient;
public ProvinciaRepository(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("http://info-geografica.com:8000").build();
}
public ProvinciaVo obtenerProvinciaPorNombre(){
ProvinciaVo provinciaVo = webClient.get().uri("/api/provincias").
retrieve().bodyToMono(ProvinciaVo.class).
block();
return provinciaVo;
}
}
En futuros post veremos como realizar tests de integración de nuestros servicios con repositorios basados en webclient.
Hasta la próxima!