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);
}
...
Аннотируя наш StudentController
с помощью @RestController
, мы сказали Spring Boot записать тип возвращаемого значения метода чтения
в тело ответа. Поскольку у нас также есть @RequestMapping
на уровне класса , он будет таким же для любых дополнительных общедоступных методов, которые мы добавляем.
Несмотря на простоту, этому подходу не хватает семантики HTTP. Например, что произойдет, если мы не найдем запрошенного студента? Вместо того, чтобы возвращать код состояния 200 или 500, мы могли бы захотеть вернуть 404.
Давайте посмотрим, как получить больший контроль над самим HTTP-ответом и, в свою очередь, добавим в наш контроллер несколько типичных RESTful-поведений.
3. Создать
Когда нам нужно контролировать аспекты ответа, отличные от тела, например, код состояния, мы можем вместо этого вернуть ResponseEntity
:
@PostMapping("/")
public ResponseEntity<Student> 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);
}
}
Здесь мы делаем гораздо больше, чем просто возвращаем созданного Student
в ответ. Мы также отвечаем семантически понятным HTTP-статусом и, если создание прошло успешно, URI для нового ресурса.
4. Читать
Как упоминалось ранее, если мы хотим прочитать одного студента
, семантически более понятно вернуть 404, если мы не можем найти студента:
@GetMapping("/{id}")
public ResponseEntity<Student> 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<Student> 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<Object> deleteStudent(@PathVariable Long id) {
service.delete(id);
return ResponseEntity.noContent().build();
}
Мы не реализовали специальную обработку ошибок, потому что метод delete()
на самом деле терпит неудачу, вызывая исключение.
7. Заключение
В этой статье мы узнали, как потреблять и создавать контент JSON в типичной службе CRUD REST, разработанной с помощью Spring Boot. Кроме того, мы продемонстрировали, как реализовать надлежащий контроль состояния ответа и обработку ошибок.
Чтобы упростить задачу, на этот раз мы не стали вдаваться в постоянство, но Spring Data REST предоставляет быстрый и эффективный способ создания службы данных RESTful.
Полный исходный код примера доступен на GitHub .