4. Rest Api con controlador con Anotaciones - giovany79/reactive GitHub Wiki

En este escenario vamos a crear una librería virtual con un catálogo de APIs para que otro sistema la puedan usar. Debe cumplir con características de modelo no bloqueante, asíncrono con el fin de que pueda ser escalado fácilmente.

Esta librería virtual debe exponer los siguientes servicios:

  • Obtener todos los libros
  • Obtener un libro en específico
  • Registrar un nuevo libro
  • Actualizar un libro
  • Eliminar un libro
  • Eliminar todos los productos

Controlador por anotaciones

Es casi idéntico al modelo MVC, de hecho en la documentación, en la sesión de spring webflux, tiene un link informando que la documentación es la misma de Spring MVC. Aplica las mismas anotaciones, request mapping, uri patterns. link

En el modelo MVC tu tienes dos formas de anotar los controladores

  • @Controller: Para modelado y construir el rendering
  • @RestController: Es una combinación de anotaciones, controlller y response body para indicar que cada método del controlador escribe al response body directamente

Request Mapping La anotación de request mapping que es usada para mapear el request al método controlador es la misma anotación usada en Spring MVC. En este caso se puede usar:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

La gran diferencia entre SpringMVC y Spring Webflux es como los request y response son manejados y el soporte para tipos reactivos (Mono y Flux)

En Spring WebFlux hay una clase llamada ServerWebExchange que actua como un contenedor de request, response y atributos de sesión HTTP. Sin necesitas trabajar a bajo nivel, tu puedes inyectar esta clase en tus métodos del controlador, pero la mayor parte del tiempo se trabaja con ServerHttpRequest que es la versión reactiva de HttpRequest y con ServerHttpResponse que es la versión reactiva de HttpResponse.

Spring Webflux soporta todos los argumentos de métodos soportados por SpringMVC, sin embargo algunos de ellos, por lo que representan, pueden tratase como no bloqueantes. Tipos como Mono y Flux pueden usarse. Los únicos que soportan tipos reactivos son:

  • WebSession: Proporciona acceso a a la sesión
  • Java.security.principal: Representa el usuario actual autenticado
  • @RequestBody: Acceso al request body
  • HttpEntity:Acceso al request header y body
  • @RequestPart: Para acceso a la información del multipart

Tipos de retorno

Los tipos reactivos son soportados por todos los valores de return, por ejemplo, tu puedes devolver un mono de ResponseEntity para especificar la respuesta completa incluyendo httpHeader y Body.

Puedes devolver un Mono o Flux de cualquier objeto o un Mono o Flux de un objeto del servidor para emitir eventos del lado del servidor

Puedes devolver void, Mono o null para devolver objetos vacíos. En estos casos son manejados como response válidos ServerHttpResponse o ServerWebExchange o una anotación @ResponseStatus

⚠️ **GitHub.com Fallback** ⚠️