Spring Boot che utilizza e produce JSON

1. Panoramica

In questo tutorial, mostreremo come creare un servizio REST per utilizzare e produrre contenuto JSON con Spring Boot .

Daremo anche un'occhiata a come possiamo facilmente impiegare la semantica HTTP RESTful.

Per semplicità, non includeremo un livello di persistenza, ma Spring Data rende anche questo semplice da aggiungere.

2. Servizio REST

Scrivere un servizio REST JSON in Spring Boot è semplice, poiché questa è la sua opinione predefinita quando Jackson si trova sul classpath:

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

Annotando il nostro StudentController con @RestController , abbiamo detto a Spring Boot di scrivere il tipo di ritorno del metodo di lettura nel corpo della risposta. Poiché abbiamo anche un @RequestMapping a livello di classe , sarebbe lo stesso per tutti i metodi pubblici che aggiungiamo.

Sebbene semplice, questo approccio manca di semantica HTTP. Ad esempio, cosa dovrebbe accadere se non troviamo lo studente richiesto? Invece di restituire un codice di stato 200 o 500, potremmo voler restituire un codice di stato 404.

Diamo un'occhiata a come ottenere un maggiore controllo sulla risposta HTTP stessa e, a sua volta, aggiungere alcuni comportamenti RESTful tipici al nostro controller.

3. Crea

Quando abbiamo bisogno di controllare aspetti della risposta diversi dal corpo, come il codice di stato, possiamo invece restituire 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); } } 

In questo caso, stiamo facendo molto di più che restituire lo Studente creato nella risposta. Inoltre, rispondiamo con uno stato HTTP semanticamente chiaro e, se la creazione è riuscita, un URI alla nuova risorsa.

4. Leggi

Come accennato in precedenza, se vogliamo leggere un singolo studente , è semanticamente più chiaro restituire un 404 se non riusciamo a trovare lo studente:

@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); } } 

Qui, possiamo vedere chiaramente la differenza dalla nostra implementazione iniziale di read () .

In questo modo l' oggetto Student verrà mappato correttamente al corpo della risposta e restituito allo stesso tempo con uno stato appropriato.

5. Aggiorna

L'aggiornamento è molto simile alla creazione, tranne per il fatto che è mappato a PUT anziché a POST e l'URI contiene un ID della risorsa che stiamo aggiornando:

@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. Elimina

L'operazione di eliminazione viene mappata al metodo DELETE. L'URI contiene anche l' id della risorsa:

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

Non abbiamo implementato una gestione specifica degli errori, perché il metodo delete () fallisce effettivamente lanciando un'eccezione.

7. Conclusione

In questo articolo, abbiamo visto come consumare e produrre contenuto JSON in un tipico servizio CRUD REST sviluppato con Spring Boot. Inoltre, abbiamo dimostrato come implementare un controllo corretto dello stato di risposta e la gestione degli errori.

Per mantenere le cose semplici, questa volta non siamo entrati nella persistenza, ma Spring Data REST fornisce un modo rapido ed efficiente per creare un servizio dati RESTful.

Il codice sorgente completo per l'esempio è disponibile su GitHub.