Получить доступ

Что произойдёт при создании ресурса через POST, если контроллер возвращает ResponseEntity со статусом 201?

MiddleSpring MVC и RESTSpring
Ещё спрашивают так:
  • Что возвращать при создании ресурса в REST?
Коротко

201 Created сопровождают заголовком Location с адресом созданного ресурса; тело — созданный ресурс или пусто. Spring сам Location не проставляет.

  • ResponseEntity.created(uri).body(dto)
  • URI — через ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
  • Для асинхронной обработки — 202 Accepted со ссылкой на статус

А ещё Повтор POST — ключ идемпотентности

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Удобный способ построить такой ответ — ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(id).toUri() и затем ResponseEntity.created(uri). Тело при этом разрешено и обычно полезно — возвращают представление созданного ресурса, чтобы клиент не делал второй запрос. Идемпотентность к статусу отношения не имеет: POST не идемпотентен по определению, а защита от повторов строится отдельно, через ключ идемпотентности. Если создание асинхронное и ресурс ещё не готов, корректнее вернуть 202 Accepted со ссылкой на статус операции.

Что хотят услышать

  • 201 и Location.
  • Как сформировать в Spring.
  • 202 для асинхронного создания — плюс.

Частые ошибки

  • Возвращать 200 на создание ресурса.
  • Опускать Location и заставлять клиента угадывать адрес.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Правильно дополнить ответ заголовком Location с адресом созданного ресурса — это часть контракта 201
  • ✗Тело ответа обязано быть пустым при статусе 201
  • ✗Статус 201 требует, чтобы запрос был идемпотентным
  • ✗Spring сам подставит Location по имени метода контроллера

Что спросят дальше

  • Когда уместнее 202 вместо 201?
  • Как защититься от повторной отправки POST?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем