«1. Обзор

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

Мы также рассмотрим, как мы можем легко использовать семантику RESTful HTTP.

Для простоты мы не будем включать уровень сохраняемости, но Spring Data также упрощает его добавление.

2. Служба REST

Написать службу JSON REST в Spring Boot очень просто, так как это мнение по умолчанию, когда Джексон находится в пути к классам: сказал Spring Boot записать возвращаемый тип метода чтения в тело ответа. Поскольку у нас также есть @RequestMapping на уровне класса, он будет таким же для любых дополнительных общедоступных методов, которые мы добавляем.

@RestController
@RequestMapping("/students")
public class StudentController {

    @Autowired
    private StudentService service;

    @GetMapping("/{id}")
    public Student read(@PathVariable String id) {
        return service.find(id);
    }

...

Несмотря на простоту, этому подходу не хватает семантики HTTP. Например, что должно произойти, если мы не найдем запрошенного студента? Вместо того, чтобы возвращать код состояния 200 или 500, мы могли бы захотеть вернуть 404.

Давайте посмотрим, как получить больший контроль над самим ответом HTTP и, в свою очередь, добавим некоторые типичные RESTful-поведения в наш контроллер.

3. Создать

Когда нам нужно управлять аспектами ответа, отличными от тела — например, кодом состояния — мы можем вместо этого вернуть ResponseEntity:

Здесь мы делает гораздо больше, чем просто возвращает созданного Student в ответ. Кроме того, мы отвечаем семантически понятным HTTP-статусом и, если создание прошло успешно, URI для нового ресурса.

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

4. Чтение

Как упоминалось ранее, если мы хотим прочитать одного студента, семантически более ясно вернуть 404, если мы не можем найти студента:

Здесь мы можем ясно увидеть отличие от нашей первоначальной реализации read().

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

Таким образом, объект Student будет правильно сопоставлен с телом ответа и одновременно возвращен с правильным статусом.

5. Обновление

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

6. Удалить

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

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

Мы не реализовали специальную обработку ошибок, потому что метод delete() на самом деле терпит неудачу, вызывая исключение.

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

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

В этой статье мы увидели, как потреблять и создавать контент JSON в типичном сервисе CRUD REST, разработанном с помощью Spring Boot. Кроме того, мы продемонстрировали, как реализовать надлежащий контроль состояния ответа и обработку ошибок.

Чтобы упростить задачу, на этот раз мы не стали вдаваться в постоянство, но Spring Data REST предоставляет быстрый и эффективный способ создания службы данных RESTful.

Полный исходный код примера доступен на GitHub.

«