Spring Boot forbruker og produserer JSON

1. Oversikt

I denne veiledningen viser vi hvordan du bygger en REST-tjeneste for å konsumere og produsere JSON-innhold med Spring Boot.

Vi vil også se på hvordan vi enkelt kan bruke RESTful HTTP semantikk.

For enkelhets skyld inkluderer vi ikke et utholdenhetslag, men Spring Data gjør dette også enkelt å legge til.

2. REST-tjeneste

Å skrive en JSON REST-tjeneste i Spring Boot er enkelt, da det er standardoppfatningen når Jackson er på klassestien:

@RestController @RequestMapping ("/ students") offentlig klasse StudentController {@Autowired privat StudentService-tjeneste; @GetMapping ("/ {id}") offentlig student lest (@PathVariable streng-id) {retur service.find (id); } ... 

Ved å kommentere vår StudentController med @RestController, Vi har bedt Spring Boot om å skrive returtypen av lese metode til responsorganet. Siden vi også har en @RequestMapping på klassenivå, ville det være det samme for flere offentlige metoder vi legger til.

Selv om det er enkelt, denne tilnærmingen mangler HTTP-semantikk. Hva skal for eksempel skje hvis vi ikke finner den forespurte studenten? I stedet for å returnere en 200 eller en 500 statuskode, vil vi kanskje returnere en 404.

La oss ta en titt på hvordan vi kan bryte mer kontroll over selve HTTP-responsen og i sin tur legge til noen typiske RESTful atferd til kontrolleren vår.

3. Opprett

Når vi trenger å kontrollere andre aspekter av responsen enn kroppen - som statuskoden - kan vi i stedet returnere en ResponseEntity:

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

Her gjør vi mye mer enn bare å returnere det opprettet Student i svaret. I tillegg svarer vi med en semantisk klar HTTP-status og, hvis opprettelsen lyktes, en URI til den nye ressursen.

4. Les

Som nevnt før, hvis vi vil lese en singel Student, det er mer semantisk klart å returnere en 404 hvis vi ikke finner studenten:

@GetMapping ("/ {id}") offentlig ResponseEntity lest (@PathVariable ("id") Lang id) {Student funnetStudent = service.read (id); if (foundStudent == null) {return ResponseEntity.notFound (). build (); } annet {return ResponseEntity.ok (foundStudent); }} 

Her kan vi tydelig se forskjellen fra vår første lese() gjennomføring.

På denne måten Student objektet blir riktig kartlagt til responsorganet og returnert med riktig status samtidig.

5. Oppdater

Oppdatering er veldig likt opprettelsen, bortsett fra at den er kartlagt til PUT i stedet for POST, og URI inneholder en id av ressursen vi oppdaterer:

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

6. Slett

Sletteoperasjonen er tilordnet SLETTE-metoden. URI inneholder også id av ressursen:

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

Vi implementerte ikke spesifikk feilhåndtering, fordi slett () metoden faktisk mislykkes ved å kaste en Unntak.

7. Konklusjon

I denne artikkelen så vi hvordan vi kan konsumere og produsere JSON-innhold i en typisk CRUD REST-tjeneste utviklet med Spring Boot. I tillegg demonstrerte vi hvordan du implementerer riktig responsstatuskontroll og feilhåndtering.

For å gjøre ting enkelt, gikk vi ikke ut i utholdenhet denne gangen, men Spring Data REST gir en rask og effektiv måte å bygge en RESTful datatjeneste på.

Den komplette kildekoden for eksemplet er tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found