1. Обзор
В этом уроке мы покажем как построить REST-сервис для потребления и создания JSON-контента с помощью Spring Boot .
Мы также рассмотрим, как мы можем легко использовать RESTful HTTP-семантику.
Для простоты мы не будем включать слой персистентности , но Spring Data также упрощает его добавление.
2. ОБСЛУЖИВАНИЕ ОТДЫХА
Написать 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); } ...
Комментируя ваш Student Controller с @RestController , мы сказали Spring Boot записать возвращаемый тип метода read в тело ответа. Поскольку у нас также есть @RequestMapping на уровне класса , это будет то же самое для любых других открытых методов, которые мы добавим.
Несмотря на простоту, этому подходу не хватает семантики HTTP. Например, что должно произойти, если мы не найдем искомого студента? Вместо того, чтобы возвращать код состояния 200 или 500, мы могли бы вернуть 404.
Давайте посмотрим, как добиться большего контроля над самим HTTP-ответом и, в свою очередь, добавить некоторые типичные спокойные поведения в наш контроллер.
3. Создание
Когда нам нужно контролировать аспекты ответа, отличные от тела – например, код состояния, – мы можем вместо этого вернуть ResponseEntity :
@PostMapping("/") public ResponseEntitycreate(@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 ResponseEntityread(@PathVariable("id") Long id) { Student foundStudent = service.read(id); if (foundStudent == null) { return ResponseEntity.notFound().build(); } else { return ResponseEntity.ok(foundStudent); } }
Здесь мы ясно видим отличие от нашей первоначальной реализации read () .
Таким образом, Студент объект будет правильно сопоставлен с телом ответа и в то же время возвращен с соответствующим статусом.
5. Обновление
Обновление очень похоже на создание, за исключением того, что оно сопоставляется с PUT вместо POST, а URI содержит id ресурса, который мы обновляем:
@PutMapping("/{id}") public ResponseEntityupdate(@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 также содержит id ресурса:
@DeleteMapping("/{id}") public ResponseEntity
Мы не реализовали конкретную обработку ошибок , потому что метод delete() на самом деле терпит неудачу, вызывая исключение .
7. Заключение
В этой статье мы рассмотрели, как потреблять и создавать контент JSON в типичном сервисе CRUD REST, разработанном с помощью Spring Boot. Кроме того, мы продемонстрировали, как реализовать правильный контроль состояния ответа и обработку ошибок.
Чтобы все было просто, на этот раз мы не стали вдаваться в персистентность, но Spring Data REST предоставляет быстрый и эффективный способ создания службы данных RESTful.
Полный исходный код для этого примера доступен на GitHub .