Пролетното зареждане Консумира и произвежда JSON

1. Общ преглед

В този урок ще покажем как да изградим REST услуга, която да консумира и произвежда JSON съдържание с Spring Boot .

Също така ще разгледаме как можем лесно да използваме RESTful HTTP семантика.

За простота няма да включваме слой за устойчивост, но Spring Data също прави това лесно добавяне.

2. REST услуга

Написването на JSON REST услуга в Spring Boot е лесно, тъй като това е мнението по подразбиране, когато Джаксън е на пътя на класа:

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

Като анотираме нашия StudentController с @RestController , казахме на Spring Boot да напише типа връщане на метода за четене в тялото на отговора. Тъй като имаме и @RequestMapping на ниво клас , би било същото за всички публични методи, които добавяме.

Макар и прост, този подход липсва HTTP семантика. Например какво трябва да се случи, ако не намерим искания студент? Вместо да върнем код за състояние 200 или 500, може да поискаме да върнем код 404.

Нека да разгледаме как да извлечем повече контрол върху самия HTTP отговор и на свой ред да добавим някои типични RESTful поведения към нашия контролер.

3. Създайте

Когато трябва да контролираме аспекти на отговора, различни от тялото - като кода на състоянието - вместо това можем да върнем 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); } } 

Тук правим много повече от просто връщане на създадения ученик в отговора. Освен това отговаряме със семантично ясен HTTP статус и, ако създаването е успяло, URI към новия ресурс.

4. Прочетете

Както споменахме по-горе, ако искаме да прочетем един ученик , по-семантично е по-ясно да върнем 404, ако не можем да намерим ученика:

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

Тук можем ясно да видим разликата от първоначалната ни реализация read () .

По този начин обектът Student ще бъде правилно картографиран в тялото на отговора и ще бъде върнат с подходящо състояние едновременно.

5. Актуализация

Актуализирането е много подобно на създаването, с изключение на това, че е преобразувано в PUT вместо в POST, а URI съдържа идентификатор на ресурса, който актуализираме:

@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. Изтриване

Операцията за изтриване се съпоставя с метода DELETE. URI също съдържа идентификационния номер на ресурса:

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

Не внедрихме конкретна обработка на грешки, тъй като методът delete () всъщност се проваля, като хвърля изключение.

7. Заключение

В тази статия видяхме как да консумираме и произвеждаме JSON съдържание в типична услуга CRUD REST, разработена с Spring Boot. Освен това демонстрирахме как да приложим правилен контрол на състоянието на отговора и обработка на грешки.

За да улесним нещата, този път не се впуснахме в постоянство, но Spring Data REST предоставя бърз и ефективен начин за изграждане на услуга за данни RESTful.

Пълният изходен код за примера е достъпен на GitHub.