Uso de Web Client : Cliente HTTP

Web client o cliente web, es una interfaz que se utiliza como punto principal de entrada para peticiones web.

Web client fue creado como una parte del módulo de Spring web reactivo, reemplaza al clásico RestTemplate en ese contexto, concretamente por ser reactivo y no bloqueante.

Dado que vamos a utilizar Web Client como parte de una aplicación SpringBoot, necesitaremos la dependencia «spring-boot-starter-webflux» implementada en el POM.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

En el caso de utilizar Gradle, lo definimos del siguiente modo:

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-webflux'
}

Trabajando con Web Client.

A la hora de trabajar con esta interfaz, debemos enfocarnos en tres puntos:

  • Crear la instancia.
  • Hacer la petición.
  • Recibir y gestionar la respuesta.

Creación de una instancia Web Client

Generalmente podemos crear la instancia de tres maneras:

La primera es la creación de un objeto WebCliente por defecto, con los valores predeterminados:

Webclient client = WebClient.create();

La segunda opción es inicializar una instancia con una URI de base:

WebClient client = WebClient.create("http://localhost8080");

La tercera opción, que es la más avanzada, es la creación del cliente a través de la clase DefaultWebClientBuilder, esto nos permite una definición propia de de los atributos de la instancia:

WebClient client = WebClient.builder()
.baseUrl("http:/localhost:8080")
.defaultCookie("cookieKey","CookieValue")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.defaultURiVariables(Collections.SingletonMAp("url", "http://localhost:8080")
.build();

Es posible que necesitemos limitar los timeouts (tiempos de espera de respuesta) de algún modo, para ello podemos crear un HttpClient y adaptar a el nuestro Web Client, de ese modo podremos configurarlo, en base a ello podemos :

  • Definir el valor del timeout usando ChannelOption.CONNECT_TIMEOUT_MILLIS.
  • Definir los timeouts de lectura/escritura con ReadTimeoutHandler/WriteTimeoutHandler
  • Configurar el timeout de respuesta usando la directiva responseTimeout

Un ejemplo de implementación de control de timeouts:

HttpClient httpClient = HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 45000)
.responseTimeOut(Duration.ofMillis(45000))
.doOnConnected(conn ->
conn.addHandlerLast(new REadTimeoutHandler(4500, Timeunit,MILLISECONDS))
.addHandlerLast(new WriteTimeoutHandler(5000, TimeUnit.MILLISSECONDS)));

WebClient client  = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();

Creando la petición :

1- Definición del método

A la hora de realizar una petición Http necesitamos definir el método a utilizar:

UriSpec<RequestBodySpec> uriSpec = client.method(HttpMethod.POST);

También podemos hacerlo utilizando la manera abreviada:

UriSpec<RequestBodySpec> uriSpec = client.post();

2- Definición de la URL

El siguiente paso es aportar una URL, también hay varios modos de hacerlo:

Pasando la URI como un literal contenido en un String

RequestBodySpec bodySpec = uriSpec.uri("/ruta");

Usando una función UriBuilder

RequestBodySpec bodySpec = uriSPec.uri(
uriBuilder -> uriBuilder.pathSegment("/ruta").build());

O definiéndolo como una URL java.net

RequestBodySpec bodySpec = uriSpec.uri(URI.create("/resource"));

Definición del body

¿Te ha resultado útil?

Promedio de puntuación 5 / 5. Recuento de votos: 2

Deja una respuesta