@ MichaelBurr прав насчет идемпотентности и побочных эффектов.
Мое мнение таково, что в данном запросе REST участвуют 2 состояния: состояние клиента и состояние сервера. REST предназначен для передачи этих состояний между сервером и клиентом, так что состояние клиента отображается на подмножество состояния сервера, иными словами, подмножество остается согласованным с сервером. Из-за этого идемпотентность должна означать, что последующие идемпотентные запросы не приведут к тому, что какое-либо состояние будет отличаться от того, которое было бы при выполнении запроса только один раз. При первом УДАЛЕНИИ вы представляете, что сервер удаляет ресурс и сообщает клиенту, что он также может удалить ресурс (так как ресурс «больше не существует»). Теперь оба состояния должны быть идентичны предыдущему с минусом удаленного элемента. Чтобы клиент делал что-то другое, когда он пытается удалить элемент после того, как он уже был удален, то состояние, которое передается с сервера на клиент, должно содержать другую информацию. Сервер может делать что-то немного иначе с информацией о том, что ресурс уже удален, но как только он отвечает чем-то другим, идемпотентность методов существенно нарушается.
Для идемпотентной функции:
delete(client_state) -> client_state - {item}
delete(delete(client_state)) -> client_state - {item}
delete(client_state) = delete(delete(client_state))
Лучший способ гарантировать эту идемпотентность, если ответ сервера идентичен, то есть единственный способ для состояния клиента нарушить идемпотентность, это отсутствие неопределенности или побочные эффекты в обработке клиентом ответа ( что, вероятно, указывает на неправильную реализацию обработки ответа).
Если между клиентом и сервером существует соглашение о том, что коды состояния существуют за пределами представления передаваемого состояния (REST), то можно сообщить клиенту, что элемент «больше не существует» ( как в первом запросе) с дополнительным комментарием, который ранее был удален. Что клиент делает с этой информацией, неясно, но это не должно влиять на итоговое состояние клиента. Но тогда код состояния нельзя использовать для передачи состояния, или, скорее, если он также сообщает состояние в других ситуациях (например, может быть, «у вас нет разрешения на удаление этого элемента» или «элемент не был удален»), тогда есть некоторая введенная двусмысленность или путаница. Таким образом, вам, по крайней мере, нужна довольно веская причина для того, чтобы вносить больше путаницы в общение, если вы хотите сказать, что DELETE является идемпотентом и все еще имеет ответ сервера, зависящий от предыдущих запросов DELETE, которые идентичны.
HTTP-запросы включают методы удаления, поэтому функция может напоминать
delete(client_state) = send_delete(client_state) -> receive_delete(client_state)
-> respond_to_delete(informative_state)
-> handle_response(informative_state)
-> client_state - {item}