Весняне завантаження Споживання та виробництво 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 бутсу писати тип повертається читання методи в тіло відповіді. Оскільки ми також маємо @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.