En este articulo, muestro cómo construir un servicio REST para consumir y producir contenido JSON con Spring Boot.

También analizaremos cómo podemos emplear fácilmente la semántica RESTful HTTP.

Para simplificar, no incluiremos una capa de persistencia, pero Spring Data hace que esto también sea fácil de agregar.

Servicio REST

Escribir un servicio JSON REST en Spring Boot es simple, ya que esa es su opción predeterminada cuando Jackson está en el classpath:

@RestController
@RequestMapping("/estudiante")
public class EstudianteController {
 
    @Autowired
    private ServicioEstudiante service;
 
    @GetMapping("/{id}")
    public Estudiante leer(@PathVariable String id) {
        return service.find(id);
    }
 
...

Al anotar nuestro EstudianteController con @RestController, le hemos dicho a Spring Boot que escriba el tipo de retorno del método de lectura en el cuerpo de la respuesta. Ya que también tenemos un @RequestMapping a nivel de clase, sería el mismo para cualquier otro método público que agreguemos.

Aunque simple, este enfoque carece de semántica HTTP. Por ejemplo, ¿qué debería pasar si no encontramos al estudiante solicitado? En lugar de devolver un código de estado 200 o 500, es posible que desee devolver un 404.

Echemos un vistazo a cómo obtener más control sobre la propia respuesta HTTP y, a su vez, agregar algunos comportamientos típicos de RESTful a nuestro controlador.

Crear

Cuando necesitamos controlar aspectos de la respuesta que no sean el cuerpo, como el código de estado, podemos devolver una Entidad de respuesta:

@PostMapping("/")
public ResponseEntity<Estudiante> crear(@RequestBody Estudiante estudiante) throws URISyntaxException {
    Estudiante crearEstudiante = service.create(estudiante);
    if (crearEstudiante == null) {
        return ResponseEntity.notFound().build();
    } else {
        URI uri = ServletUriComponentsBuilder.fromCurrentRequest()
          .path("/{id}")
          .buildAndExpand(crearEstudiante.getId())
          .toUri();
 
        return ResponseEntity.created(uri)
          .body(crearEstudiante);
    }
}

Aquí, estamos haciendo mucho más que devolver al Estudiante creado en la respuesta. Además, respondemos con un estado HTTP semánticamente claro y, si la creación se realizó correctamente, un URI para el nuevo recurso.

Leer

Como se mencionó anteriormente, si queremos leer a un solo Estudiante, es más claro semánticamente devolver un 404 si no podemos encontrar al estudiante:

@GetMapping("/{id}")
public ResponseEntity<Estudiante> leer(@PathVariable("id") Long id) {
    Estudiante estudiante = service.read(id);
    if (estudiante == null) {
        return ResponseEntity.notFound().build();
    } else {
        return ResponseEntity.ok(estudiante);
    }
}

Aquí, podemos ver claramente la diferencia con nuestra implementación inicial de lectura.

De esta manera, el objeto de Estudiante se asignará correctamente al cuerpo de la respuesta y se devolverá con un estado adecuado al mismo tiempo.

Actualizar

La actualización es muy similar a la creación, excepto que se asigna a PUT en lugar de POST, y el URI contiene una identificación del recurso que estamos actualizando:

@PutMapping("/{id}")
public ResponseEntity<Estudiante> actualizar(@RequestBody Estudiante estudiante, @PathVariable Long id) {
    Estudiante estudianteActualizado = service.update(id, estudiante);
    if (estudianteActualizado == null) {
        return ResponseEntity.notFound().build();
    } else {
        return ResponseEntity.ok(estudianteActualizado);
    }
}

Borrar

La operación de eliminación se asigna al método DELETE. URI también contiene el id del recurso:

@DeleteMapping("/{id}")
public ResponseEntity<Object> borrarEstudiante(@PathVariable Long id) {
    service.delete(id);
    return ResponseEntity.noContent().build();
}

Conclusión

En este artículo, vimos cómo consumir y producir contenido JSON en un servicio típico de REST CRUD desarrollado con un Spring Boot. Además, demostramos cómo implementar el control de estado de respuesta adecuado y el manejo de errores.

Para simplificar las cosas, esta vez no persistimos nada, pero Spring Data REST ofrece una manera rápida y eficiente de crear un servicio de datos RESTful.

Tagged in:

, , ,