Ответ
Неидемпотентный 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), но состояние системы (отсутствие ресурса) меняться уже не будет.