-
Notifications
You must be signed in to change notification settings - Fork 14
implementacionrestspring
- Implementación de las representaciones de los recursos
- Implementación de una clase recurso
- Manejo de Excepciones
Spring MVC es una tecnología que facilita la creación de servicios Web de acuerdo con la arquitectura REST. Las clases anotadas con @RestController
contienen las implementaciones correspondientes a cada verbo http (GET|POST|PUT|DELETE) asociadas con cada URI (path). Por ejemplo, podemos suponer que tenemos una clase controlador para definir todos los servicios que se ofrecen para el recurso Book.
Si un cliente HTTP invoca un servicio, por ejemplo POST /books
, tendremos lo siguiente:
- La petición
POST /books
es procesada del lado del servidor por Spring. - Spring identifica el
endpoint
, es decir, el método asociado con la ruta/books
y el método correspondiente alPOST
- El método es ejecutado.
- Cuando finaliza la ejecución, la respuesta es transformada para que sea devuelta siguiendo el formato definido en el protocolo HTTP y enviada de regreso al cliente en la representación seleccionada por el desarrollador, por ejemplo JSON. La Figura 5 ilustra de una forma simplificada lo que sucede. En la petición viaja un objeto en formato JSON. Cuando la petición es procesada por Spring, el método correspondiente con la petición recibe un objeto Java; en la figura este objeto es una instancia de la clase
BookDTO
.
Figura 5: Ejemplo petición Post |
Mientras que el cliente de los servicios REST utiliza representaciones JSON de los recursos, la implementación de los recursos utiliza objetos de alguna clase Java. Las instancias de esta clase son objetos que solo tienen los valores de los atributos y se suelen llamar POJOs (Plain Old Java Object). Por convención cada clase Java que representa un recurso se llama: RecursoDTO donde Recurso es el nombre de recurso y la sigla DTO significa Data Transfer Object. Por ejemplo, para el recurso Book tenemos la clase BookDTO .
Supongamos que queremos diseñar servicios REST para una aplicación que maneja información básica de ciudades: crear una ciudad, obtener todas las ciudades, obtener una ciudad dado su identificador, cambiar la información de una ciudad dado su identificador y borrar una ciudad dado su identificador.
Método | Path | Acción | Parámetros | Cuerpo | Retorno |
---|---|---|---|---|---|
GET | /cities | Lista los registros de City (READ) | Colección de registros de City | ||
GET | /cities/:id | Obtiene los atributos de una instancia de City (READ) que tiene como identificador el atributo id | @PathParam id: Identificador del registro | Atributos de la instancia de City | |
POST | /cities | Crear una nueva instancia de la entidad City (CREATE) | Atributos de la instancia de City a crear | Instancia de City creada, incluyendo su nuevo ID | |
PUT | /cities/:id | Actualiza una instancia de la entidad City (UPDATE) | @PathParam id: Identificador del registro | Objeto JSON de City | Instancia de City actualizada |
DELETE | /cities/:id | Borra instancia de City en el servidor (DELETE) | @PathParam id: Identificador del registro |
La clase CityController
tendrá entonces los siguientes métodos.
Método | Descripción |
---|---|
List <CityDTO> findAll() | Retorna la lista de ciudades |
CityDTO create(CityDTO city) | Crea una ciudad con la información enviada como parámetro. |
CityDTO findOne(Long id) | Retorna la ciudad identificada con id. |
CityDTO updateCity(Long id, CityDTO city) | Actualiza la información de la ciudad identificada con id. |
void delete(Long id) | Borra la ciudad identificada con id. |
Para que Spring procese una clase como recurso, esta debe estar anotada. Las anotaciones sirven para indicar que la clase es un controlador (@RestController) y para indicar el path del recurso (por ejemplo, @RequestMapping("/cities")).
Anotación | Método | Descripción |
---|---|---|
@GetMapping | List<CityDTO> findAll() | Retorna la lista de ciudades. |
@PostMapping | CityDTO create(CityDTO city) | Crea una ciudad con la información enviada como parámetro. |
@GetMapping | CityDTO findOne( Long id) | Retorna la ciudad identificada con id. |
@PutMapping | CityDTO update(Long id, CityDTO city) | Actualiza la información de la ciudad identificada con id con la información pasada por parámetro en city.
|
@DeleteMapping | void delete(Long id) | Borra la ciudad identificada con id. |
Cuando definimos en el API REST el servicio:
*GET /cities
En este caso cities
es el path. Cuando en una clase recurso todos los métodos tienen el mismo path inicial este path se puede anotar al comienzo de la clase:
@RequestMapping("/cities")
public class CityController {
....
}
Cuando el path tiene más información que el del comienzo de la clase, por ejemplo:
GET /cities/id
Donde id, en este ejemplo, es el identificador de la ciudad y es un valor numérico.
En este caso se debe definir:
@GetMapping(value="/{id}")
public CityDTO findOne(@PathVariable("id") Long id) throws EntityNotFoundException {
...
}
Note que el método debe recibir ese id como parámetro. El tipo del parámetro ha sido definido como Long y está anotado con @PathVariable("id")
.
Este libro fue creado para el curso ISIS2603 Desarrollo de Software en Equipos en la Universidad de los Andes. © Desarrollado por Rubby Casallas con la colaboración de César Forero, Kelly Garcés, Jaime Chavarriaga y José Bocanegra. Universidad de los Andes, Bogotá, Colombia. 2021.
Esta wiki fue creada para el curso ISIS2603 Desarrollo de Software en Equipos en la Universidad de los Andes. Desarrollado por Rubby Casallas con la colaboración de César Forero, Kelly Garcés, Jaime Chavarriaga y José Bocanegra. Universidad de los Andes, Bogotá, Colombia. 2021.
- Instalación del ambiente en máquina propia
- Configuración de la máquina virtual
- Ejecución del back
- Uso de Codespaces
- Clases
- Herencia
- Asociaciones
- Tipos de asociaciones
- Caso de estudio: la biblioteca
- Caso de estudio: la empresa
- Java Persistence API (JPA)
- Implementación paso a paso persistencia
- Ejemplo implementación persistencia
- Carga de datos en el Backend
- Relaciones compartidas (Shared) OneToOne
- Relaciones compartidas (Shared) OneToMany/ManyToOne
- Relaciones compuestas (Composite) OneToMany/ManyToOne
- Conceptos básicos de REST
- Diseño API REST
- Tutorial documentación diseño API
- Implementación API REST con Spring
- Tutorial implementación API