Skip to content

implementacionrestspring

José Bocanegra edited this page Mar 7, 2023 · 4 revisions

Banner Curso

Implementación de los servicios REST con Spring

  1. Implementación de las representaciones de los recursos
  2. Implementación de una clase recurso
  3. 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:

  1. La petición POST /books es procesada del lado del servidor por Spring.
  2. Spring identifica el endpoint, es decir, el método asociado con la ruta /books y el método correspondiente al POST
  3. El método es ejecutado.
  4. 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")).

Anotaciones para indicar el verbo HTTP

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.

Anotación para indicar el PATH

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.

Clone this wiki locally