Ответ
Идемпотентность — это свойство HTTP-запроса, при котором повторная отправка одного и того же запроса приводит к тому же состоянию на сервере, что и после первого успешного выполнения.
Это ключевое свойство для построения надежных и предсказуемых API, особенно в условиях нестабильной сети, когда запросы могут дублироваться.
Классификация методов
-
Идемпотентные методы:
GET
,HEAD
,OPTIONS
,TRACE
: Безопасные методы, не изменяют состояние сервера.PUT
: Полностью заменяет ресурс. ПовторныйPUT
с теми же данными просто перезапишет ресурс тем же состоянием.DELETE
: Удаляет ресурс. ПовторныйDELETE
вернет ошибку (например, 404), но состояние системы (отсутствие ресурса) не изменится.
-
Неидемпотентные методы:
POST
: Обычно создает новый ресурс. Каждый повторный запрос создаст новую сущность.PATCH
: Частично обновляет ресурс. Не является идемпотентным по спецификации, так как результат может зависеть от текущего состояния ресурса (например, инкремент значения).
Пример
# Идемпотентный запрос: сколько раз ни вызывай, пользователь 1 будет иметь имя "Alice"
PUT /users/1 HTTP/1.1
Content-Type: application/json
{ "name": "Alice" }
# Неидемпотентный запрос: каждый вызов создаст нового пользователя
POST /users HTTP/1.1
Content-Type: application/json
{ "name": "Bob" }