Что произойдёт при создании ресурса через POST, если контроллер возвращает ResponseEntity со статусом 201?
- Что возвращать при создании ресурса в REST?
201 Created сопровождают заголовком Location с адресом созданного ресурса; тело — созданный ресурс или пусто. Spring сам Location не проставляет.
ResponseEntity.created(uri).body(dto)- URI — через ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
- Для асинхронной обработки — 202 Accepted со ссылкой на статус
А ещё Повтор POST — ключ идемпотентности
Подробно
Удобный способ построить такой ответ — ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(id).toUri() и затем ResponseEntity.created(uri). Тело при этом разрешено и обычно полезно — возвращают представление созданного ресурса, чтобы клиент не делал второй запрос. Идемпотентность к статусу отношения не имеет: POST не идемпотентен по определению, а защита от повторов строится отдельно, через ключ идемпотентности. Если создание асинхронное и ресурс ещё не готов, корректнее вернуть 202 Accepted со ссылкой на статус операции.
Что хотят услышать
- 201 и Location.
- Как сформировать в Spring.
- 202 для асинхронного создания — плюс.
Частые ошибки
- Возвращать 200 на создание ресурса.
- Опускать Location и заставлять клиента угадывать адрес.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Тело ответа со статусом 201 обязано быть пустым, иначе клиент выдаст ошибку
- ✗Статус 201 требует, чтобы запрос был идемпотентным, как PUT
- ✓Добавить заголовок Location с адресом созданного ресурса
- ✗Spring сам подставит Location по имени метода контроллера
Что спросят дальше
- Когда уместнее 202 вместо 201?
- Как защититься от повторной отправки POST?
Разбор темы
- REST API: статусы, согласование и семантика
Ресурсы и HTTP-глаголы, статус-коды как контракт, content negotiation и message converters, идемпотентность и версионирование.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.