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
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);
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);
}
}
}