Spring Boot Consumir y producir JSON

1. Información general

En este tutorial, mostraremos cómo crear un servicio REST para consumir y producir contenido JSON con Spring Boot .

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

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

2. Servicio REST

Escribir un servicio JSON REST en Spring Boot es simple, ya que esa es su opinión predeterminada cuando Jackson está en la ruta de clases:

@RestController @RequestMapping("/students") public class StudentController { @Autowired private StudentService service; @GetMapping("/{id}") public Student read(@PathVariable String id) { return service.find(id); } ... 

Anotando nuestra StudentController con @RestController , hemos dicho resorte de arranque para escribir el tipo de retorno de la lectura método para el cuerpo de la respuesta. Dado que también tenemos un @RequestMapping a nivel de clase , sería lo mismo para cualquier otro método público que agreguemos.

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

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

3. Crear

Cuando necesitamos controlar aspectos de la respuesta distintos del cuerpo, como el código de estado, podemos devolver una ResponseEntity :

@PostMapping("/") public ResponseEntity create(@RequestBody Student student) throws URISyntaxException { Student createdStudent = service.create(student); if (createdStudent == null) { return ResponseEntity.notFound().build(); } else { URI uri = ServletUriComponentsBuilder.fromCurrentRequest() .path("/{id}") .buildAndExpand(createdStudent.getId()) .toUri(); return ResponseEntity.created(uri) .body(createdStudent); } } 

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

4. Leer

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

@GetMapping("/{id}") public ResponseEntity read(@PathVariable("id") Long id) { Student foundStudent = service.read(id); if (foundStudent == null) { return ResponseEntity.notFound().build(); } else { return ResponseEntity.ok(foundStudent); } } 

Aquí, podemos ver claramente la diferencia con nuestra implementación inicial read () .

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

5. Actualización

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 update(@RequestBody Student student, @PathVariable Long id) { Student updatedStudent = service.update(id, student); if (updatedStudent == null) { return ResponseEntity.notFound().build(); } else { return ResponseEntity.ok(updatedStudent); } } 

6. Eliminar

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

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

No implementamos un manejo de errores específico, porque el método delete () en realidad falla al lanzar una excepción.

7. Conclusión

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

Para simplificar las cosas, esta vez no entramos en la persistencia, pero Spring Data REST proporciona una forma rápida y eficiente de crear un servicio de datos RESTful.

El código fuente completo para el ejemplo está disponible en GitHub.