Спокойный способ удаления нескольких предметов - PullRequest
87 голосов
/ 11 марта 2010

В Вики-статья для ОТДЫХА указано, что если вы используете http://example.com/resources DELETE, это означает, что вы удаляете всю коллекцию.

Если вы используете http://example.com/resources/7HOU57Y УДАЛИТЬ, это означает, что вы удаляете этот элемент.

Я делаю ВЕБ-САЙТ, обратите внимание, НЕ ВЕБ-СЕРВИС.

У меня есть список, в котором есть 1 флажок для каждого элемента в списке. Как только я выберу несколько элементов для удаления, я позволю пользователям нажимать кнопку под названием УДАЛИТЬ ВЫБОР. Если пользователь нажмет кнопку, появится диалоговое окно js с просьбой подтвердить удаление. если пользователь подтверждает, все элементы будут удалены.

Так, как я должен заботиться об удалении нескольких элементов ОТЛИЧНЫМ способом?

ПРИМЕЧАНИЕ: в настоящее время для DELETE на веб-странице я использую тег FORM с POST в качестве действия, но включаю _method со значением DELETE, поскольку это то, что было указано другими в SO о том, как сделать RESTful удалить для веб-страницы .

Ответы [ 7 ]

49 голосов
/ 11 марта 2010

Один из вариантов - создать «транзакцию». Таким образом, вы POST получаете что-то вроде http://example.com/resources/deletes нового ресурса, состоящего из списка ресурсов, которые нужно удалить. Затем в вашем приложении вы просто делаете удаление. Когда вы отправляете сообщение, вы должны вернуть местоположение созданной вами транзакции, например, http://example.com/resources/deletes/DF4XY7. GET в этом случае может вернуть статус транзакции (завершена или выполняется) и / или список ресурсов, которые необходимо удалить.

46 голосов
/ 15 марта 2010

Я думаю, ответ Рохоки пока лучший.Небольшое отклонение может состоять в том, чтобы покончить с подтверждением javascript на той же странице, и вместо этого создать выделение и перенаправить его, показывая сообщение подтверждения на этой странице.Другими словами:

От:
http://example.com/resources/

сделать

POST с выбором идентификаторов:
http://example.com/resources/selections

, который, в случае успеха, должен ответить:

HTTP / 1.1 201 создан и заголовок Location:
http://example.com/resources/selections/DF4XY7

На этой странице вы увидите(javascript) поле подтверждения, которое при подтверждении выполнит запрос:

DELETE http://example.com/resources/selections/DF4XY7

, который, в случае успеха, должен ответить: HTTP / 1.1 200 Ok (или чтоподходит для успешного удаления)

26 голосов
/ 09 января 2017

Вот что Amazon сделал со своим S3 REST API.

Индивидуальный запрос на удаление:

DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: authorization string (see Authenticating Requests (AWS Signature Version 4))

Удаление нескольких объектов Запрос:

POST /?delete HTTP/1.1
Host: bucketname.s3.amazonaws.com
Authorization: authorization string
Content-Length: Size
Content-MD5: MD5

<?xml version="1.0" encoding="UTF-8"?>
<Delete>
    <Quiet>true</Quiet>
    <Object>
         <Key>Key</Key>
         <VersionId>VersionId</VersionId>
    </Object>
    <Object>
         <Key>Key</Key>
    </Object>
    ...
</Delete>           

Но Facebook Graph API , Parse Server REST API и Google Drive REST API позволяют еще больше, позволяя вам "группировать" отдельные операции в одном запросе .

Вот пример с сервера Parse.

Индивидуальный запрос на удаление:

curl -X DELETE \
  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
  https://api.parse.com/1/classes/GameScore/Ed1nuqPvcm

Пакетный запрос:

curl -X POST \
  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
        "requests": [
          {
            "method": "POST",
            "path": "/1/classes/GameScore",
            "body": {
              "score": 1337,
              "playerName": "Sean Plott"
            }
          },
          {
            "method": "POST",
            "path": "/1/classes/GameScore",
            "body": {
              "score": 1338,
              "playerName": "ZeroCool"
            }
          }
        ]
      }' \
  https://api.parse.com/1/batch
13 голосов
/ 11 марта 2010

Я бы сказал, УДАЛИТЬ http://example.com/resources/id1,id2,id3,id4 или УДАЛИТЬ http://example.com/resources/id1+id2+id3+id4. Поскольку "REST - это протокол архитектуры (...) [не]", чтобы процитировать эту статью в Википедии, я полагаю, нет единого один из способов сделать это.

Я знаю, что выше невозможно без JS с HTML, но я чувствую, что REST был:

  • Создано без учета мелких деталей, таких как транзакции. Кому нужно будет оперировать более чем одним предметом? Это как-то оправдано в протоколе HTTP, так как он не предназначен для обслуживания через него чего-либо другого, кроме статических веб-страниц.
  • Нет необходимости хорошо приспосабливаться к текущим моделям - даже из чистого HTML.
6 голосов
/ 05 апреля 2014

Интересно, что я думаю, что тот же метод применяется к PATCHing нескольких сущностей и требует размышления о том, что мы имеем в виду с помощью нашего URL, параметров и метода REST.

  1. вернуть все элементы 'foo':

    [GET] api/foo

  2. вернуть элементы 'foo' с фильтрацией для определенных идентификаторов:

    [GET] api/foo?ids=3,5,9

В этом смысле URL и фильтр определяют «с какими элементами мы имеем дело?», А метод REST (в данном случае «GET») говорит «что делать с этими элементами?»

  1. Следовательно, ПАТЧИРУЙТЕ несколько записей, чтобы пометить их как прочитанные

    [PATCH] api/foo?ids=3,5,9

.. с данными foo [read] = 1

  1. Наконец, для удаления нескольких записей эта конечная точка наиболее логична:

    [DELETE] api/foo?ids=3,5,9

Пожалуйста, поймите, я не верю, что в этом есть какие-то "правила" - для меня это просто "имеет смысл"

1 голос
/ 20 марта 2019

Как Достойный ответ Dabbler и rojocas answer говорит, что наиболее каноническим является использование виртуальных ресурсов для удаления выбранных ресурсов, но я думаю, что это неправильно с точки зрения REST, потому что выполнение DELETE http://example.com/resources/selections/DF4XY7 должно удалить сам ресурс выбора, а не выбранные ресурсы.

Принимая Maciej Piechotka anwser или fezfox answer , у меня есть только одно возражение: есть более канонический способ передачи массива идентификаторов, и используется оператор массива:

DELETE /api/resources?ids[]=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d&ids[]=7e8f9a0b-1c2d-3e4f-5a6b-7c8d9e0f1a2b

Таким образом, вы атакуете конечную точку «Удалить коллекцию», но правильно фильтруете удаление строкой запроса.

0 голосов
/ 15 марта 2010

Поскольку не существует «правильного» способа сделать это, то, что я делал в прошлом:

отправить DELETE на http://example.com/something с данными в кодировке xml или json в теле.

когда вы получите запрос, отметьте УДАЛИТЬ, если оно истинно, а затем прочитайте тело для тех, которые будут удалены.

...