5. Rest API con endpoints funcionales - giovany79/reactive GitHub Wiki

Es una forma alternativa a los endpoints basados por anotaciones. Esta basada en funciones o expresiones lambda para definir routes o handlers para manejar los request

Router Functions

Toma un ServerRequest y retorna un Mono de tipo HandlerFunction. Normalmente no tienes que escribir funciones router function. Se usa el método estático route

RouterFunctions.route(RequestPredicate, HandlerFunction)

Para crear una ruta. Toma dos argumentos:

  • RequestPredicate: Es una interfase funcional que representa una función que evalúa un request que hace match con el path o el método http
public abstract class RequestPredicates{
   static RequestPredicate accept(MediaType...mediatypes)
   static RequestPredicate GET(String pattern)
   static RequestPredicate method(HttpMethod httpMethod)
   static RequestPredicate method(String pattern)
}
  • HandlerFunction: La función handler que atenderá la petición
interfase HandlerFunction<T extends ServerResponse>{
    Mono<T> handle(ServerRequest request)
}

Ejemplo Router Function

RouterFunction <ServerResponse> myRoute = RouterFunctions.route(RequestPredicate.path("/book"), 
                                                                handler::getAllBooks)
                                                          .andRoute(RequestPredicate.POST("/book"), 
                                                                handler::saveBooks);

Handler Functions

Una handler function es cualquier método que toma un argumento de tipo ServerRequest y retorna un mono de tipo Server Response. ServerRequest representa un http request y ServerResponse representa un httpResponse. Los dos se manejan de manera asincrona

Para extraer el body se usa el método bodyToMono o bodyToFlux en caso que sea una lista. Luego de realizar la operación deseada se retorna un serverResponse con sus respectivos status code, header y body(opcionalmente). Todo estas funciones se agrupa en una clase Handler para facil lectura y estructuración

class BookHandler{
  public Mono <ServerResponse> myHandlerFunction(ServerRequest request){
    Mono<Book> book = request.bodyToMono(Book.class);
    //Flux<Book> books = request.bodyToFlux(Book.class);
    
    return ServerResponse.ok(){
              .contentType(MediaType.APPLICATION_JSON).body(book);
    }

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