REST, HTTP УДАЛЯЕТ и параметры

Действительно ли там что-нибудь неуспокоительно об обеспечении параметров к HTTP, УДАЛЯЮТ запрос?


Мой сценарий - то, что я моделирую, "Вы уверены, что хотите удалить это?" сценарий. В некоторых случаях состояние ресурса предлагает, чтобы требуемые удалили, может быть недопустимым. Можно, вероятно, вообразить некоторые сценарии сами, где подтверждение удаления требуется

Решение, которое мы приняли, состоит в том, чтобы передать параметр удалить запросу, чтобы указать, что нормально возобновлять удаление ("? force_delete=true")

например.

DELETE http://server/resource/id?force_delete=true

Я полагаю, что это все еще успокоительно с тех пор:

(a) Семантика УДАЛЯЕТ, не изменяются - пользователь может все еще отправить, нормальное УДАЛЯЮТ запрос, но это может перестать работать с 409, и орган по ответу объяснит почему. Я говорю, может перестать работать, потому что (по причинам, которые не стоит объяснить) в некоторых случаях нет никакой причины предложить пользователю.

(b) Нет ничего в диссертации Roy, чтобы предположить, что это против духа REST - почему там был бы, так как HTTP является только одной реализацией REST итак, почему передающие параметры HTTP имели бы значение


Кто-то может указать на меня на категорический оператор, который закрепляет причину, почему это не УСПОКОИТЕЛЬНО?

По связанному вопросу, если пользователь не указывает force_delete затем, я возвращаюсь 409 Conflict - это - самый соответствующий код ответа?


Продолжить

После некоторого дальнейшего исследования я думаю, что добавление параметров к УДАЛЕНИЮ может нарушить несколько принципов.

Прежде всего, реализация возможно нарушает "Универсальный Интерфейс" (см. раздел 5.1.5 из диссертации Roy

Путем добавления 'force_delete' мы добавляем, что дополнительное ограничение на уже четко определенный УДАЛЯЕТ метод. Это ограничение значимо только для нас.

Вы могли также утверждать, что это нарушает "5.1.2, Клиент-сервер", так как диалог подтверждения является действительно беспокойством UI и снова не, все клиенты захотят подтвердить удаление.

Предложения кто-либо?

126
задан Chris McCauley 2 December 2015 в 10:37
поделиться

3 ответа

Нет, это не RESTful. Единственная причина, по которой вы должны помещать глагол ( force_delete ) в URI, - это необходимость перегрузки методов GET / POST в среде, где методы PUT / DELETE недоступны. Судя по использованию вами метода DELETE, это не так.

Код ошибки HTTP 409 / Конфликт следует использовать в ситуациях, когда существует конфликт, который не позволяет службе RESTful выполнить операцию, но все же существует вероятность того, что пользователь сможет разрешить конфликт сам. Подтверждение перед удалением (при отсутствии реальных конфликтов, препятствующих удалению) не является конфликтом как таковым, поскольку ничто не мешает API выполнить запрошенную операцию.

Как сказал Алекс (я не знаю, кто его проголосовал против, он прав), это следует обрабатывать в пользовательском интерфейсе, потому что служба RESTful как таковая просто обрабатывает запросы и, следовательно, не должна иметь состояния (т.е. она не должна полагаться на подтверждения путем хранения любой серверной информации о запросе).

Два примера того, как это сделать в пользовательском интерфейсе:

  • pre-HTML5 : * показать пользователю диалоговое окно подтверждения JS и отправить запрос только в том случае, если пользователь подтвердит его
  • HTML5 : * используйте форму с действием УДАЛИТЬ, где форма будет содержать только кнопки «Подтвердить» и «Отменить» («Подтвердить» будет кнопкой отправки)

(*) Обратите внимание, что версии HTML до 5 не поддерживают изначально поддерживают HTTP-методы PUT и DELETE, однако большинство современных браузеров могут использовать эти два метода с помощью вызовов AJAX. См. эту ветку для получения подробной информации о кроссбраузерной поддержке.


Обновление (на основе дополнительных исследований и обсуждений):

Сценарий, в котором служба требует наличия флага force_delete = true , нарушает единый интерфейс как определено в диссертации Роя Филдинга.Кроме того, согласно HTTP RFC , метод DELETE может быть переопределен на исходном сервере (клиенте), подразумевая, что это не выполняется на целевом сервере (службе).

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

76
ответ дан 24 November 2019 в 00:55
поделиться

Я думаю, это не успокаивает. Я не думаю, что успокаивающая служба должна обрабатывать требование принуждения пользователя к подтверждению удаления. Я бы справился с этим в пользовательском интерфейсе.

Имеет ли смысл указывать force_delete = true, если бы это был API программы? Если бы кто-то писал сценарий для удаления этого ресурса, не хотели бы вы заставить его указать force_delete = true для фактического удаления ресурса?

34
ответ дан 24 November 2019 в 00:55
поделиться

В дополнение к ответу Алекса:

Обратите внимание, что http: // server / resource / id? Force_delete = true идентифицирует другой ресурс, отличный от http: // server / resource / id . Например, огромная разница, удаляете ли вы / customers /? Status = old или / customers /.

Ян

6
ответ дан 24 November 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: