Есть ли что-нибудь, отличное от RESTful, в предоставлении параметров для HTTP-запроса DELETE?
Мой сценарий таков, что я моделирую «Вы уверены, что хотите удалить это?» сценарий. В некоторых случаях состояние ресурса предполагает, что запрошенное удаление может быть недопустимым. Вы, наверное, сами можете представить сценарии, в которых требуется подтверждение удаления.
Мы приняли решение: передать параметр в запрос на удаление, чтобы указать, что можно продолжить удаление ("? Force_delete = true")
например
DELETE http://server/resource/id?force_delete=true
Я считаю, что он все еще успокаивает с тех пор:
(a) Семантика DELETE не изменяется - пользователь по-прежнему может отправить обычный запрос DELETE, но это может не сработать с 409, и в теле ответа будет объяснено, почему. Я говорю, что может потерпеть неудачу, потому что (по причинам, не заслуживающим объяснения) в некоторых случаях нет причин побуждать пользователя.
(b) В диссертации Роя нет ничего, что могло бы предположить, что это противоречит духу REST - почему это могло быть, поскольку HTTP - это только одна реализация REST, поэтому почему передача параметров HTTP имеет значение
Может ли кто-нибудь указать мне на окончательное утверждение, объясняющее причину, по которой это не RESTful?
По связанному с этим вопросу: если пользователь не указывает force_delete, я возвращаюсь 409 Conflict
- это наиболее подходящий код ответа?
Следовать за
После некоторых дополнительных исследований я думаю, что добавление параметров в DELETE может нарушить несколько принципов.
Во-первых, реализация, возможно, нарушает «Единый интерфейс» (см. Раздел 5.1.5 диссертации Роя.
Добавляя force_delete, мы добавляем дополнительное ограничение к уже четко определенному методу DELETE. Это ограничение имеет значение только для нас.
Вы также можете возразить, что это нарушает «5.1.2 Клиент-Сервер», поскольку диалог подтверждения действительно является проблемой пользовательского интерфейса, и, опять же, не все клиенты захотят подтвердить удаление.
Предложения кого-нибудь?
Ответы:
Нет, это не RESTful. Единственная причина, по которой вы должны помещать глагол (
force_delete
) в URI, - это необходимость перегрузки методов GET / POST в среде, где методы PUT / DELETE недоступны. Судя по использованию вами метода DELETE, это не так.Код ошибки HTTP
409/Conflict
следует использовать в ситуациях, когда существует конфликт, который не позволяет службе RESTful выполнить операцию, но все же существует вероятность того, что пользователь сможет разрешить конфликт самостоятельно. Подтверждение перед удалением (при отсутствии реальных конфликтов, препятствующих удалению) не является конфликтом как таковым, поскольку ничто не мешает API выполнить запрошенную операцию.Как сказал Алекс (я не знаю, кто его проголосовал против, он прав), это следует обрабатывать в пользовательском интерфейсе, потому что служба RESTful как таковая просто обрабатывает запросы и, следовательно, не должна иметь состояния (т.е. она не должна полагаться на подтверждения, удерживая любая серверная информация о запросе).
Два примера того, как это сделать в пользовательском интерфейсе:
(*) Обратите внимание, что версии HTML до 5 не поддерживают методы PUT и DELETE HTTP изначально, однако большинство современных браузеров могут использовать эти два метода с помощью вызовов AJAX. См. Эту ветку для получения подробной информации о кросс-браузерной поддержке.
Обновление (на основе дополнительных исследований и обсуждений):
Сценарий, в котором службе потребуется наличие
force_delete=true
флага, нарушает единый интерфейс, как определено в диссертации Роя Филдинга. Кроме того, согласно HTTP RFC , метод DELETE может быть переопределен на исходном сервере (клиенте), подразумевая, что это не выполняется на целевом сервере (службе).Таким образом, как только служба получает запрос DELETE, она должна обрабатывать его без необходимости какого-либо дополнительного подтверждения (независимо от того, действительно ли служба выполняет операцию).
источник
force_delete=true
? Согласно HTTP RFC, метод DELETE может быть переопределен на исходном сервере (клиенте), подразумевая, что это не выполняется на целевом сервере (службе). Итак, я понимаю, что как только служба получит запрос DELETE, она должна обработать его без какого-либо подтверждения (независимо от того, действительно ли служба выполняет операцию).Я думаю, что это не успокаивает. Я не думаю, что успокаивающая служба должна обрабатывать требование принуждения пользователя к подтверждению удаления. Я бы справился с этим в пользовательском интерфейсе.
Имеет ли смысл указывать force_delete = true, если бы это был API программы? Если бы кто-то писал сценарий для удаления этого ресурса, не хотели бы вы заставить его указать force_delete = true, чтобы фактически удалить ресурс?
источник
Это старый вопрос, но вот несколько комментариев ...
источник
В дополнение к ответу Алекса:
Обратите внимание, что http: // server / resource / id? Force_delete = true идентифицирует ресурс, отличный от http: // server / resource / id . Например, огромная разница, удаляете ли вы / customers /? Status = old или / customers /.
январь
источник