Implementación de una API RESTful con Spring Framework (V): Controlador y fachada

, , No Comments
En esta entrada veremos la implementación del controlador y la fachada. El controlador gestionará las peticiones HTTP y hará uso de la clase fachada, que albergará la lógica de negocio de nuestro servicio. Esta última utilizará el repositorio de datos para realizar operaciones contra la base de datos.


Finalizaré la entrada con algunos ejemplos de consumo de la API implementada con un cliente REST y unas conclusiones sobre este primer tutorial básico de implementación de una API RESTful con Spring Framework.

Fachada

La clase fachada implementada es LibroFacade, y puesto que de momento nuestra lógica de negocio es muy sencilla, simplemente realiza llamadas al repositorio de datos. Hemos utilizado las siguientes anotaciones en la clase.
  • @Service (línea 12): utilizada con el fin de que Spring Framework sepa que es un componente y pueda gestionarlo como tal. 
  • @Autowired (línea 15): puesto que la clase hace uso del repositorio de datos (LibroJpaRepository), se ha realizado una inyección de dependencia mediante esta anotación. 
La clase dispone de métodos para:
  • Obtener todos los libros (línea 18). 
  • Obtener un libro por su identificador (línea 22).
  • Actualizar un libro (línea 26). 
  • Insertar un libro (línea 30).
  • Borrar un libro (línea 35). 

Controlador

La clase LibroController será el controlador que gestione las peticiones HTTP. Esta clase utiliza las siguientes anotaciones.
  • @RestController (línea 20): para informar a Spring de que la clase es un controlador. Quitar el nombre del controlador por ahora
  • @Autowired (línea 24): para la inyección de dependencia de la clase fachada.
  • @RequestMapping (p. ej. línea 37): indica la ruta que se deberá utilizar para llamar al servicio. Esta anotación se encuentra en la propia clase (ruta raíz del servicio /libros) y en los métodos para indicar las rutas concretas para esas peticiones respecto a la ruta raíz. Si la ruta se especifica mediante llaves, se indica que el valor será variable (por ejemplo, un GET a libros/1 o libros/2). Además se han utilizado las propiedades method y consumes para especificar el tipo de llamada HTTP que soportan y el tipo de dato que esperan consumir.
  • @RequestBody (p. ej. línea 38): indica la entidad a la que se mapearán los datos que lleguen en el cuerpo de la petición HTTP. En este caso se enviará un JSON representando al libro en cuestión. Para realizar el mapeo correctamente, el documento JSON deberá tener las mismas propiedades que la clase Libro.
  • @PathVariable (p. ej. línea 33): se utiliza para asignar a una variable el valor de la ruta especificado entre llaves. 
Las llamadas soportadas por el controlador son las siguientes:
  • GET /libros: obtiene todos los libros.
  • GET /libros/1: obtiene un libro por su identificador.
  • PUT /libros/1: actualiza un libro determinado.
  • POST /libros: crea un nuevo libro.
  • DELETE /libros/1: borra un libro por su identificador.
En el método de inserción de un libro (línea 44), se ha implementado un fragmento de código que incorpora en la cabecera de la respuesta el link al nuevo recurso creado (líneas 48 a 51). 


Consumo de la API

Para poder consumir nuestro servicio, podemos utilizar cualquier cliente REST. En este caso, vamos a utilizar Advanced Rest Client, que es una extensión de Chrome. En la siguiente animación, se muestra cómo se obtiene en primera instancia el listado de libros en formato JSON. Después se obtiene el libro número 1.

Posteriormente, se inserta un nuevo libro, proporcionando el JSON que representa el libro y especificando el tipo de dato que se envía en el cuerpo de la petición (Content-Type: application/json). Finalmente se elimina el libro insertado.



Los códigos de respuesta obtenidos son proporcionados de forma automática por el controlador de Spring Framework en base al tipo de operación que se realiza.

  • 200 - OK, es la respuesta estándar para las peticiones que se han servido correctamente.
  • 201 - Creado, se utiliza para informar de que un recurso se ha creado correctamente. 

Conclusiones

Y hasta aquí el ejemplo básico de implementación de una API RESTful con Spring Framework y JPA. Como se puede observar, Spring Framework simplifica mucho desarrollo de una API RESTful, evitando al programador la escritura de líneas redundantes que tienden a aumentar el número de errores. 

Además, los métodos básicos de gestión de recursos vienen ya proporcionados por Spring Framework mediante sus repositorios de datos. Estas características hacen de esta aproximación una buena elección de cara a implementar una API RESTful de forma sencilla, centrando las labores de programación, sobre todo, en la lógica de negocio del propio servicio.

En próximas entradas actualizaré el proyecto para incorporar nuevas funcionalidades con el fin de poder ver más características de Spring Framework y JPA, como por ejemplo, el control de excepciones, nuevas anotaciones, mapeos de relaciones entre entidades, etc.

Pulsa aquí para acceder al código de esta entrada en mi repositorio Github

0 comentarios:

Publicar un comentario