Какие основные HTTP-методы не являются идемпотентными и почему

Ответ

Идемпотентный метод — это метод, многократное повторение которого с одними и теми же параметрами приводит к тому же результату и состоянию сервера, что и одиночный вызов.

Основными неидемпотентными методами являются POST и, в общем случае, PATCH.

  1. 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
  2. PATCH

    • Назначение: Применяется для частичного обновления ресурса.
    • Почему не идемпотентен: Его результат может зависеть от текущего состояния ресурса. Например, если PATCH-запрос добавляет элемент в массив, каждый повторный вызов будет добавлять еще один элемент, изменяя ресурс.
    // Пример тела запроса JSON Patch для добавления тега
    // PATCH /articles/123
    [{ "op": "add", "path": "/tags/-", "value": "new" }]

    Каждый раз при выполнении этого запроса в массив tags будет добавляться новая строка "new".


Для сравнения, идемпотентные методы:

  • GET, HEAD, OPTIONS: Безопасные методы, не изменяют состояние сервера.
  • PUT: Создает или полностью заменяет ресурс. Повторный вызов с теми же данными приведет ресурс к тому же состоянию.
  • DELETE: Удаляет ресурс. Повторный вызов вернет 404 Not Found, но состояние сервера (отсутствие ресурса) останется тем же.