Ответ
Идемпотентный метод — это метод, многократное повторение которого с одними и теми же параметрами приводит к тому же результату и состоянию сервера, что и одиночный вызов.
Основными неидемпотентными методами являются POST
и, в общем случае, PATCH
.
-
POST
- Назначение: Обычно используется для создания нового дочернего ресурса.
- Почему не идемпотентен: Каждый повторный запрос
POST
на один и тот же эндпоинт (например,/users
) создаст новый, уникальный ресурс с новым ID. Состояние сервера изменяется при каждом вызове.
# Первый запрос -> создает пользователя с id: 1 curl -X POST -H "Content-Type: application/json" -d '{"name": "Alex"}' http://api.example.com/users # Второй запрос -> создает пользователя с id: 2 curl -X POST -H "Content-Type: application/json" -d '{"name": "Alex"}' http://api.example.com/users
-
PATCH
- Назначение: Применяется для частичного обновления ресурса.
- Почему не идемпотентен: Его результат может зависеть от текущего состояния ресурса. Например, если
PATCH
-запрос добавляет элемент в массив, каждый повторный вызов будет добавлять еще один элемент, изменяя ресурс.
// Пример тела запроса JSON Patch для добавления тега // PATCH /articles/123 [{ "op": "add", "path": "/tags/-", "value": "new" }]
Каждый раз при выполнении этого запроса в массив
tags
будет добавляться новая строка"new"
.
Для сравнения, идемпотентные методы:
GET
,HEAD
,OPTIONS
: Безопасные методы, не изменяют состояние сервера.PUT
: Создает или полностью заменяет ресурс. Повторный вызов с теми же данными приведет ресурс к тому же состоянию.DELETE
: Удаляет ресурс. Повторный вызов вернет404 Not Found
, но состояние сервера (отсутствие ресурса) останется тем же.