В вики-статье для REST указано, что если вы используете http://example.com/resources DELETE, это означает, что вы удаляете всю коллекцию.
Если вы используете http://example.com/resources/7HOU57Y DELETE, это означает, что вы удаляете этот элемент.
Я делаю ВЕБ-САЙТ, обратите внимание, НЕ ВЕБ-СЕРВИС.
У меня есть список, в котором есть 1 флажок для каждого элемента в списке. Как только я выберу несколько элементов для удаления, я разрешаю пользователям нажимать кнопку УДАЛИТЬ ВЫБОР. Если пользователь нажмет кнопку, появится диалоговое окно js с просьбой подтвердить удаление. если пользователь подтверждает, все элементы удаляются.
Итак, как мне обеспечить УДОБНОЕ удаление нескольких элементов?
ПРИМЕЧАНИЕ, в настоящее время для DELETE на веб-странице я использую тег FORM с POST в качестве действия, но включаю _method со значением DELETE, поскольку это то, что было указано другими в SO о том, как выполнить удаление RESTful для веб-страницы .
Ответы:
Я думаю ответ Рохоки пока самый лучший. Небольшое изменение может заключаться в том, чтобы отказаться от подтверждения javascript на той же странице и вместо этого создать выделение и перенаправить на него, показывая сообщение подтверждения на этой странице. Другими словами:
Из:
http://example.com/resources/
сделать
POST с выбором идентификаторов для:
http://example.com/resources/selections
который в случае успеха должен ответить:
HTTP / 1.1 201 создан и заголовок Location для:
http://example.com/resources/selections/DF4XY7
На этой странице вы увидите окно подтверждения (javascript), которое, если вы подтвердите, выполнит запрос:
УДАЛИТЬ http://example.com/resources/selections/DF4XY7
который в случае успеха должен ответить: HTTP / 1.1 200 Ok (или что-то еще, подходящее для успешного удаления)
источник
http://example.com/resources/selections/
и в полезной нагрузке (теле) запроса, вы отправляете данные, для которых вы хотите удалить элементы. Насколько я могу судить, ничто не мешает вам это делать, но меня всегда встречают «но это не RESTfull».Один из вариантов - создать «транзакцию» удаления. Итак, вы
POST
попали в нечто вродеhttp://example.com/resources/deletes
нового ресурса, состоящего из списка ресурсов, которые нужно удалить. Затем в своем приложении вы просто выполняете удаление. Когда вы делаете пост , вы должны вернуть расположение вашей созданной транзакции , например,http://example.com/resources/deletes/DF4XY7
. AGET
при этом может вернуть статус транзакции (завершена или выполняется) и / или список ресурсов, которые необходимо удалить.источник
Вот что Amazon сделала со своим S3 REST API.
Индивидуальный запрос на удаление:
Удаление нескольких объектовЗапрос на :
Но Facebook Graph API , Parse Server REST API и Google Drive REST API идут еще дальше, позволяя «группировать» отдельные операции в одном запросе.
Вот пример из Parse Server.
Индивидуальный запрос на удаление:
Пакетный запрос:
источник
Я бы сказал УДАЛИТЬ http://example.com/resources/id1,id2,id3,id4 или УДАЛИТЬ http://example.com/resources/id1+id2+id3+id4 . Поскольку «REST - это архитектура (...) [не] протокол», цитируя эту статью в Википедии, я считаю, что нет единого способа сделать это.
Я знаю, что это невозможно без JS с HTML, но я чувствую, что REST был:
источник
Интересно, что я думаю, что тот же метод применяется к ПАТЧУ нескольких объектов и требует размышлений о том, что мы подразумеваем под нашим URL, параметрами и методом REST.
вернуть все элементы 'foo':
[GET] api/foo
вернуть элементы 'foo' с фильтрацией по определенным идентификаторам:
[GET] api/foo?ids=3,5,9
В этом смысле URL и фильтр определяют «с какими элементами мы имеем дело?», А метод REST (в данном случае «GET») говорит «что делать с этими элементами?»
Следовательно, PATCH несколько записей, чтобы пометить их как прочитанные
[PATCH] api/foo?ids=3,5,9
..с данными foo [read] = 1
Наконец, для удаления нескольких записей наиболее логична эта конечная точка:
[DELETE] api/foo?ids=3,5,9
Пожалуйста, поймите, я не верю, что в этом есть какие-то «правила» - для меня это просто «имеет смысл»
источник
Как Достойный ответ Dabbler и rojocas ответ говорят, наиболее канонический используют виртуальные ресурсы , чтобы удалить выделение ресурсов, но я считаю , что это неправильно с точки зрения REST, потому исполняющим
DELETE http://example.com/resources/selections/DF4XY7
должно удалить сам ресурс выбора, а не выбранные ресурсов.Принимая ответ Maciej Piechotka anwser или fezfox , у меня есть только возражение: существует более канонический способ передачи массива идентификаторов с использованием оператора массива:
DELETE /api/resources?ids[]=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d&ids[]=7e8f9a0b-1c2d-3e4f-5a6b-7c8d9e0f1a2b
Таким образом, вы атакуете конечную точку Delete Collection, но правильно фильтруете удаление с помощью строки запроса.
источник
Поскольку нет «правильного» способа сделать это, я делал в прошлом следующее:
отправить DELETE на http://example.com/something с данными в кодировке xml или json в теле.
когда вы получите запрос, проверьте DELETE, если true, затем прочитайте тело тех, которые нужно удалить.
источник
A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.
из tools.ietf.org/html/rfc7231#section-4.3.5У меня была такая же ситуация с удалением нескольких элементов. Вот что я в итоге сделал. Я использовал операцию DELETE, и идентификаторы элементов, которые должны были быть удалены, были частью HTTP-заголовка.
источник