Spring Boot forbruger og producerer JSON

1. Oversigt

I denne vejledning viser vi det hvordan man bygger en REST-tjeneste til at forbruge og producere JSON-indhold med Spring Boot.

Vi vil også se på, hvordan vi let kan bruge RESTful HTTP semantik.

For enkelheds skyld inkluderer vi ikke et persistenslag, men Spring Data gør det også nemt at tilføje.

2. REST Service

At skrive en JSON REST-tjeneste i Spring Boot er enkel, da det er dens standardopfattelse, når Jackson er på klassestien:

@RestController @RequestMapping ("/ studerende") offentlig klasse StudentController {@Autowired privat StudentService-tjeneste; @GetMapping ("/ {id}") offentlig studerende læst (@PathVariable streng-id) {return service.find (id); } ... 

Ved at kommentere vores StudentController med @RestController, Vi har bedt Spring Boot om at skrive returneringstypen af Læs metode til reaktionsorganet. Da vi også har en @RequestMapping på klasseniveau, det ville være det samme for flere offentlige metoder, som vi tilføjer.

Selvom det er simpelt, denne tilgang mangler HTTP-semantik. Hvad skal der f.eks. Ske, hvis vi ikke finder den ønskede studerende? I stedet for at returnere en 200 eller en 500 statuskode, vil vi måske returnere en 404.

Lad os se på, hvordan vi kan bryde mere kontrol over selve HTTP-svaret og til gengæld tilføje nogle typiske RESTful adfærd til vores controller.

3. Opret

Når vi har brug for at kontrollere andre aspekter af svaret end kroppen - som statuskoden - kan vi i stedet returnere en SvarEnhed:

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

Her laver vi meget mere end bare at returnere det oprettede Studerende i svaret. Derudover reagerer vi med en semantisk klar HTTP-status og, hvis oprettelsen lykkedes, en URI til den nye ressource.

4. Læs

Som nævnt før, hvis vi vil læse en enkelt Studerende, det er mere semantisk klart at returnere en 404, hvis vi ikke kan finde den studerende:

@GetMapping ("/ {id}") offentlig ResponseEntity læst (@PathVariable ("id") Lang id) {Student fundetStudent = service.read (id); hvis (foundStudent == null) {return ResponseEntity.notFound (). build (); } andet {return ResponseEntity.ok (foundStudent); }} 

Her kan vi tydeligt se forskellen fra vores oprindelige Læs() implementering.

På denne måde Studerende objektet kortlægges korrekt til responsorganet og returneres med en korrekt status på samme tid.

5. Opdatering

Opdatering minder meget om oprettelse, bortset fra at den er kortlagt til PUT i stedet for POST, og URI indeholder en id af den ressource, vi opdaterer:

@PutMapping ("/ {id}") offentlig ResponseEntity-opdatering (@RequestBody Student-studerende, @PathVariable Lang id) {Student updatedStudent = service.update (id, student); hvis (updatedStudent == null) {return ResponseEntity.notFound (). build (); } andet {return ResponseEntity.ok (updatedStudent); }} 

6. Slet

Sletningsfunktionen er kortlagt til DELETE-metoden. URI indeholder også id af ressourcen:

@DeleteMapping ("/ {id}") offentlig ResponseEntity deleteStudent (@PathVariable Lang id) {service.delete (id); returnere ResponseEntity.noContent (). build (); } 

Vi implementerede ikke specifik fejlhåndtering, fordi slet () metoden faktisk mislykkes ved at smide en Undtagelse.

7. Konklusion

I denne artikel så vi, hvordan vi forbruger og producerer JSON-indhold i en typisk CRUD REST-tjeneste udviklet med en Spring Boot. Derudover demonstrerede vi, hvordan man implementerer korrekt responsstatuskontrol og fejlhåndtering.

For at holde tingene enkle gik vi ikke i vedholdenhed denne gang, men Spring Data REST giver en hurtig og effektiv måde at opbygge en RESTful datatjeneste på.

Den komplette kildekode til eksemplet er tilgængelig på GitHub.