Я потратил много времени, недавно прочитав спецификацию HTTP 1.1 и связав ее с REST. Я обнаружил, что есть две интерпретации метода HTTP DELETE в отношении его "идемпотентности" и безопасности. Вот два лагеря:
-
Если вы удалите ресурс с помощью HTTP DELETE, и он преуспеет (200 OK), а затем вы попытаетесь удалить этот ресурс N раз, вы должны вернуть сообщение об успешном завершении (200 OK) для каждого и каждый из этих вызовов удаления. Это его "идемпотентность".
-
Если вы удалите ресурс с помощью HTTP DELETE, и он будет успешным (200 OK), а затем вы снова попытаетесь удалить этот ресурс, вы должны вернуть сообщение об ошибке (410 Gone), потому что ресурс был удален.
В спецификации указано, что DELETE является idempotent, конечно, но он также говорит, что последовательности идемпотентных событий могут по-прежнему создавать побочные эффекты. Я действительно чувствую, что второй лагерь верен, и первый вводит в заблуждение. Какую "безопасность" мы представили, разрешив клиентам думать, что они стали причиной удаления ранее удаленных ресурсов?
В первом лагере есть много людей, в том числе несколько авторов по этому вопросу, поэтому я хотел проверить, есть ли какая-то веская причина, кроме эмоций, которые приводят людей в первый лагерь.