Ответ
Операция является идемпотентной, если её многократное повторение приводит к тому же результату и состоянию на сервере, что и однократное выполнение.
Идемпотентные методы:
GET
,HEAD
,OPTIONS
,TRACE
: Считаются "безопасными", так как предназначены только для чтения данных и не должны изменять состояние сервера.PUT
: Полностью заменяет ресурс. Повторный запрос с теми же данными не изменит итоговое состояние ресурса.DELETE
: Удаляет ресурс. Первый запрос его удаляет, а все последующие будут возвращать ошибку (например,404 Not Found
), но состояние системы больше меняться не будет.
Неидемпотентные методы:
POST
: Обычно используется для создания нового ресурса. Каждый успешный вызов может создать новую сущность с уникальным ID.PATCH
: Частично обновляет ресурс. Повторное применение операции, например, добавления комментария, изменит состояние несколько раз.
Практический пример:
PUT /users/123
с телом{"name": "Alex"}
— идемпотентно. Сколько бы раз вы ни отправили этот запрос, у пользователя с ID 123 имя будет "Alex".POST /users
с телом{"name": "Alex"}
— неидемпотентно. Каждый вызов создаст нового пользователя.
Важно: Идемпотентность — это свойство семантики метода, а не гарантия. Неправильная реализация на стороне сервера может нарушить это свойство (например, если GET-запрос будет содержать логику изменения данных).