Почему метод GET и DELETE являются идемпотентными?
Я не понимаю, почему метод GET должен возвращать один и тот же результат? Например, на сервере изменили какой-то ресурс и потом, когда мы к нему обратимся, ответ от сервера будет другим. Почему тогда он идемпотентный?
Также я не понимаю, почему метод DELETE возвращает один и тот же результат. Допустим, первый раз мы удалили ресурс, но в следующий раз, если мы перейдем по той же ссылке, то должны получить ответ, что ресурс уже удален.
Подскажите, пожалуйста, в чем я не права?
Ответы (1 шт):
Для идемпотентности нужно рассматривать только изменение фактического внутреннего состояния сервера. Когда мы используем метод GET мы ничего им не меняем на сервере. когда мы используем метод PUT с каким-то индетификатором мы меняем только одну единственную запись, так же метод DELETE удаляет одну конкретную запись.
Можно представить например как список дел:
- Купить кефир
- Выгулять питомца
- Сходить в кино
Независимо от того сколько раз подряд мы его прочтем он не изменится так как GET этот метод на чтение, он не добавляет в список ничего и ничего из него не убирает. Можно представить что у нас есть кнопка получить список и мы случайно нажали на нее 2 раза.
Теперь метод PUT например мы хотим купить не кефир а молоко, сколько бы раз мы не вызывали метод с изменением пункта 1 на Купить молоко по факту замена не приведет к новым эффектам, т.е. произойдет один (первый) раз, как замена слова в текстовом редакторе.
Что касается DELETE например мы выгуляли питомца таким образом мы удаляем пункт 2̶)̶ ̶В̶ы̶г̶у̶л̶я̶т̶ь̶ ̶п̶и̶т̶о̶м̶ц̶а̶ сколько бы раз мы его не удаляли у нас по прежнему будут пункты 1 и 3. Как и c PUT состояние на сервере изменится только 1 раз.
Что касается POST то мы можем добавить несколько одинаковых записей при каждой отсылке запроса, например если мы планируем купить 2 бутылки кефира нам нужно отправить запрос дважды (если это в сайт магазина то в корзине будет 2 кефира или столько сколько мы нажмем на кнопку добавить)
Что касается PATCH - cогласно документации он может быть идемпотентным и нет. В конечном счете идемпотентность зависит от конкретной реализации. PATCH является гораздо более общим по сравнению с PUT, по сути его можно использовать для управления ресурсами а не для изменения поля в таблице, например в PATCH могут переданы инструкции:
[
{ "op": "move", "from": "/biscuits", "path": "/cookies" }
{ "op": "remove", "path": "/foo" }
]
таким образом первый раз он отработает, а второй раз он нет (biscuits не будет найден так как он станет cookies)
и произойдет отказ (ошибка) - а это уже разные результаты выполнения.