Разница между PUT и POST

2 мин чтения

Чем PUT отличается от POST, что означает идемпотентность и как вести себя при повторе запроса.

Разница между PUT и POST

Создать заметку через POST или PUT? Ответ зависит от того, известен ли её адрес и что означает операция в вашем API. Для добавления записи в коллекцию обычно подходит POST. Если клиент задаёт состояние ресурса по известному адресу — PUT. Разберём примеры и то, что произойдёт при повторной отправке.

Создание через коллекцию

POST /api/notes
Content-Type: application/json

{"title":"Первая заметка"}

Сервер обрабатывает переданное представление согласно смыслу ресурса. При создании нового объекта уместен ответ 201 и Location с его адресом. POST не ограничен только созданием: он используется и для других операций обработки. Поэтому правило «POST всегда добавляет строку» слишком узкое.

Известный адрес

PUT /api/notes/42
Content-Type: application/json

{"title":"Исправленная заметка"}

PUT задаёт желаемое состояние целевого ресурса. Это не требует физического удаления и повторной вставки записи в базе. Важен результат и контракт представления. Для частичного изменения часто предусмотрен PATCH; формат такого изменения нужно согласовать отдельно.

Что означает идемпотентность

Повтор одинакового PUT должен иметь тот же предполагаемый эффект на целевой ресурс, что и один запрос. При этом журналы и другие сопутствующие действия могут отличаться. POST такого свойства по определению не обещает. Повтор после сетевого сбоя без дополнительной защиты может создать дубликат.

Проверяйте статусы, права и конфликты независимо от выбранного метода. Для защиты от перезаписи чужого изменения полезны версии или условные запросы. Для операций с повтором POST можно предусмотреть ключ идемпотентности, но это свойство вашего API, которое необходимо реализовать и проверить.

Повторите запрос, обратитесь к отсутствующему объекту и отправьте устаревшую версию. Проверьте реальные ответы сервера: названия PUT и POST сами по себе не обеспечивают нужное поведение. Оно должно быть определено в API и подтверждаться этими случаями.

Источники и дальнейшее чтение