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

Ответ

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

Основным неидемпотентным HTTP-методом является POST.

POST

  • Назначение: Чаще всего используется для создания нового ресурса.
  • Почему неидемпотентен: Каждый успешный POST запрос создает новую сущность. Отправка двух одинаковых POST запросов приведет к созданию двух идентичных ресурсов с разными идентификаторами.

Пример:

import requests

# Первый запрос создает пользователя с id=1
response1 = requests.post('https://api.example.com/users', json={'name': 'Alice'})

# Второй идентичный запрос создает пользователя с id=2
response2 = requests.post('https://api.example.com/users', json={'name': 'Alice'})

# Результат: в системе два пользователя с именем 'Alice'

Спорный случай: PATCH

Метод PATCH может быть как идемпотентным, так и неидемпотентным, в зависимости от операции.

  • Идемпотентный PATCH: PATCH /users/123 {'email': 'new@example.com'}. Повторные вызовы не изменят email после первого.
  • Неидемпотентный PATCH: PATCH /posts/1 {'action': 'increment_likes'}. Каждый вызов будет увеличивать счетчик лайков.

Почему PUT и DELETE считаются идемпотентными?

  • PUT: Этот метод предназначен для полного обновления или создания ресурса по известному URI. Запрос PUT /users/123 {'name': 'Bob'} при первом вызове изменит имя на "Bob". Все последующие вызовы с теми же данными не изменят состояние ресурса — имя так и останется "Bob".
  • DELETE: Первый запрос DELETE /users/123 удалит ресурс. Все последующие запросы на тот же URI вернут ошибку (например, 404 Not Found), но состояние системы (отсутствие ресурса) меняться уже не будет.