На какой URI следует ожидать HTTP DELETE? - PullRequest
3 голосов
/ 12 октября 2011

Это скорее вопрос концептуальной целостности для чего-то, что меня беспокоит.

Предполагается, что метод DELETE HTTP является идемпотентным, а URI REST должны фактически представлять вещи.Но, похоже, он определен только в направлении reverse : каждый ресурс должен иметь один URI, но данный URI, по-видимому, не нуждается в ресурсе.Более мягко говоря, я предполагаю, что URI можно определить так, чтобы они указывали на пустые / нулевые ресурсы.

Единственный момент, когда это кажется действительно актуальным, - это запрос DELETE.Где это лучшее место?example.com/users/ с содержимым, идентифицирующим ресурс, который нужно удалить, или example.com/users/USERNAME лучше?

Содержимое в DELETE выглядит нормально в HTTP и REST.(Концептуально: в соответствии с другими вопросами SO различные платформы будут молча отбрасывать содержимое из запросов DELETE, прежде чем вы сможете его обработать.)

Итак, вот мое мнение: каждый пример использует последнюю схему - где вы удаляетересурс на его URI, не удаляя ресурс из его родительской коллекции URI - но ресурс должен прекратить существовать после успешного УДАЛЕНИЯ.В этом случае URI должен выйти из строя громко, imho.Но это сведет на нет идемпотентность DELETE, и это заставит меня думать, что DELETE должен работать с коллекциями, а контент определяет фактический ресурс, который нужно удалить.Я, вероятно, должен согласиться с этим для здравомыслия моих пользователей, но есть ли где-нибудь, где это четко прописано, или очевидные вещи, которые я пропускаю, которые делают меня неправильным?

Ответы [ 2 ]

4 голосов
/ 12 октября 2011

Согласно стандарту HTTP «Метод DELETE запрашивает, чтобы сервер-источник удалил ресурс, указанный в Request-URI». - нет ничего о каком-либо теле запроса.

В этом случае URI должен потерпеть неудачу, imho. Но это сведет на нет идемпотентность DELETE

Просто верните 404. Смысл идемпотентности заключается в том, что отправка одного и того же запроса DELETE дважды не приводит к тому, что состояние сервера будет отличаться от того, когда оно было отправлено один раз. Сбой не вызывает проблемы для этого (если сервер не выключается или что-то)

1 голос
/ 13 октября 2011
Запрос

A DELETE должен применяться только к URI ресурса, который вы хотите удалить. Для удаления чего-либо через коллекцию более подходящим будет POST или PUT для этой коллекции.

Вы можете реализовать ответ на запрос DELETE, проверив ресурс и удалив его, если он существует, и верните 2xx, в противном случае просто верните 2xx (например, в случае отправки дублированных запросов). Смысл создания метода идемпотентным заключается в том, что он не будет "громко проваливаться" - он вообще не считается провалом. Так же, как PUT не различает «создать» и «обновить».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...