На какой URI следует ожидать HTTP DELETE?
Это скорее вопрос концептуальной целостности, который беспокоит меня.
Предполагается, что HTTP-метод DELETE является идемпотентным, а URI-адреса REST должны фактически представлять вещи. Но, похоже, он определен только в обратном направлении: каждый ресурс должен иметь один URI, но данный URI, похоже, не нуждается в ресурсе. Более мягко говоря, я думаю, что URI могут быть определены, чтобы указывать на пустые / нулевые ресурсы.
Единственный момент, когда это кажется действительно актуальным, - это запрос DELETE. Где это лучшее место? example.com/users/
с содержимым, идентифицирующим ресурс, который нужно удалить, или example.com/users/USERNAME
лучше?
Содержимое в DELETE выглядит нормально в HTTP и REST. (Концептуально: в соответствии с другими вопросами SO различные платформы будут молча отбрасывать контент из запросов DELETE, прежде чем вы сможете его обработать.)
Итак, вот что я думаю: каждый пример, похоже, использует последнюю схему - когда вы удаляете ресурс по его URI, а не удаляете ресурс из родительского URI коллекции - но ресурс должен прекратить существовать после успешного удаления. В этом случае URI должен выйти из строя громко, imho. Но это сведет на нет идемпотентность DELETE, что заставит меня думать, что DELETE должен работать с коллекциями, а контент определяет фактический ресурс, который нужно удалить.
Очевидно, что все просто делают то, что мне не нравится, и я, вероятно, должен согласиться с этим для здравомыслия моих пользователей, но есть ли где-нибудь, где это четко прописано, или очевидные вещи, которые я пропускаю, которые делают меня неправильным?
2 ответа
Согласно стандарту HTTP "метод DELETE запрашивает, чтобы исходный сервер удалил ресурс, указанный в Request-URI". - нет ничего о каком-либо теле запроса.
В этом случае URI должен выйти из строя громко, imho. Но это сведет на нет идемпотентность DELETE
Просто верните 404. Смысл идемпотентности в том, что отправка одного и того же запроса DELETE дважды не приводит к тому, что состояние сервера заканчивается, как если бы оно было отправлено один раз. Сбой не вызывает проблемы для этого (если сервер не выключается или что-то)
DELETE
Запрос должен применяться только к URI ресурса, который вы хотите удалить. Для удаления чего-либо через коллекцию POST
или же PUT
к этой коллекции будет более уместным.
Вы можете реализовать ответ на DELETE
запросите, проверив ресурс и удалив его, если он существует, и верните 2xx, в противном случае просто верните 2xx (например, в случае отправки дублированных запросов). Смысл создания метода идемпотентным заключается в том, что он не будет "громко проваливаться" - он вообще не считается провалом. Так же, как PUT
не делает различий между "создать" и "обновить".