Ответ
Да, HTTP-метод DELETE является идемпотентным по определению спецификации (RFC 7231).
Объяснение: Идемпотентность HTTP-метода означает, что побочные эффекты от N > 0 идентичных запросов должны быть такими же, как от одного запроса.
- Теоретически (по спецификации):
DELETEидемпотентен. После удаления ресурса последующие запросы не должны изменять состояние системы. - Практически: Поведение зависит от реализации сервера. Идемпотентность может нарушаться, если сервер:
- Возвращает разные коды состояния (например,
200 OK, затем404 Not Found). - Ведёт журнал или счётчик удалений, который увеличивается с каждым запросом.
- Возвращает разные коды состояния (например,
Пример неидеальной реализации:
# Первый запрос
DELETE /items/1 -> 200 OK (ресурс удалён)
# Второй идентичный запрос
DELETE /items/1 -> 404 Not Found (ресурс не найден)
Хотя коды ответов разные, состояние ресурса (удалён) остаётся неизменным, что соответствует идемпотентности. Нарушением было бы, если бы второй запрос создавал ошибку 500 или восстанавливал ресурс.
Ответ 18+ 🔞
А, ну вот, классика, блядь! Подходишь к такому вопросу, а там, сука, как всегда — теория гладкая, а на практике ёб твою мать, сплошные косяки.
Так, слушай сюда, разбираем этот DELETE, как муху на асфальте. По бумажкам, по этим вашим RFC, он, конечно, идемпотентный, святая корова. Что это значит-то? А значит, что если ты десять раз подряд нажмёшь на кнопку «удалить», то в идеальном мире должно произойти ровно то же самое, что и от одного нажатия. Ресурс исчез — и хуй с ним, он и дальше должен отсутствовать, а не воскресать, как Лазарь, или вызывать пиздец в системе.
Но это, блядь, в теории! На практике начинается такой цирк, что просто волосы дыбом. Вот смотри, типичная история:
# Первый раз тыкнул — ресурс был, и его спиздили.
DELETE /items/1 -> 200 OK (всё гуд, удалили)
# Второй раз, по пьяни, тыкнул туда же.
DELETE /items/1 -> 404 Not Found (а его уже нет, ёпта!)
И вот сидит какой-нибудь умник и орёт: «Ага! Код ответа другой! 200, а потом 404! Значит, не идемпотентно!». Да иди ты нахуй со своей логикой! Состояние-то системы не изменилось, сука! Ресурс был удалён после первого раза и так и остался удалённым. Это и есть идемпотентность, ёбаный насос! Побочный эффект — один и тот же: ресурса нет.
Настоящий пиздец начинается, когда серверная логика написана каким-нибудь стажёром, который про идемпотентность слышал только в контексте «иди на пенсию». Вот тогда возможны шедевры:
- Второй запрос может выстрелить ошибкой
500, потому что код пошёл искать ресурс для удаления, не нашёл и обосрался. - Или, что ещё веселее, сервер может вести счётчик удалений, и с каждым запросом этот счётчик будет расти. Вот это уже, блядь, нарушение! Состояние системы меняется — значит, идемпотентность пошла нахуй.
Так что вывод, как всегда, простой и грустный. Спецификация говорит одно, а жизнь, сука, подкидывает другое. DELETE — он идемпотентный, но только если те, кто его реализовывал, не ебланы конченые. А это, как ты понимаешь, овердохуища большое «если».