首页 文章

删除一堆项目的宁静方式

提问于
浏览
80

wiki article for REST中,表示如果使用http://example.com/resources DELETE,则表示您正在删除整个集合 .

如果使用http://example.com/resources/7HOU57Y DELETE,则表示您正在删除该元素 .

我正在做一个网站,请注意不要WEB服务 .

我有一个列表,列表中的每个项目都有1个复选框 . 一旦我选择了多个项目进行删除,我将允许用户按下名为DELETE SELECTION的按钮 . 如果用户按下按钮,将弹出一个js对话框,要求用户确认删除 . 如果用户确认,则删除所有项目 .

那么我应该如何以RESTFUL方式删除多个项目呢?

注意,目前对于网页中的DELETE,我所做的是使用带有POST作为操作的FORM标签,但是包括一个自this is what was indicated by others in SO on how to do RESTful delete for webpage以来值为DELETE的_method .

6 回答

  • 41

    一种选择是创建删除"transaction" . 所以 POST 就像 http://example.com/resources/deletes 这样的新资源,包含要删除的资源列表 . 然后在您的应用程序中,您只需删除 . 当您发布帖子时,您应该返回您创建的交易的位置,例如 http://example.com/resources/deletes/DF4XY7 . 此处的 GET 可以返回事务的状态(完成或正在进行)和/或要删除的资源列表 .

  • 0

    有趣的是,我认为相同的方法适用于PATCHing多个实体,并且需要考虑我们对URL,参数和REST方法的含义 .

    • 返回所有'foo'元素:

    [GET] api/foo

    • 返回'foo'元素并过滤特定ID:

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

    其中感觉是URL,过滤器确定“我们正在处理什么元素?”,REST方法(在本例中为“GET”)说“如何处理这些元素?”

    • 因此,PATCH多条记录将它们标记为已读

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

    ..与数据foo [读取] = 1

    • 最后要删除多条记录,此 endpoints 最符合逻辑:

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

    请理解我不相信这有任何“规则” - 对我来说它只是“有道理”

  • 22

    我会说DELETE http://example.com/resources/id1,id2,id3,id4或DELETE http://example.com/resources/id1+id2+id3+id4 . 正如"REST is an architecture (...) [not] protocol"引用这篇维基百科文章一样,我相信,没有一种方法可以做到这一点 .

    我知道如果没有带HTML的JS,上面是不可能的,但我觉得REST是:

    • 在没有考虑交易等细微细节的情况下创建 . 谁需要操作更多单品?这在HTTP协议中是合理的,因为除了静态网页之外,它不打算通过它提供任何其他服务 .

    • 没有必要很好地适应当前的模型 - 即使是纯HTML .

  • 45

    以下是亚马逊用他们的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))
    

    Multi-Object Delete请求:

    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 APIParse Server REST APIGoogle Drive REST API甚至可以通过一个请求中的"batch"个别操作来进一步发展 .

    这是Parse Server的一个例子 .

    个人删除请求:

    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

    由于没有“正确”的方法来做到这一点,我过去所做的是:

    使用正文中的xml或json编码数据将_DELETE发送到http://example.com/something .

    当您收到请求时,检查DELETE,如果为true,则读取正文以查找要删除的请求 .

  • 6

    我认为rojoca's answer是迄今为止最好的 . 稍微变化可能是,在同一页面上取消javascript确认,而是创建选择并重定向到它,在该页面上显示确认消息 . 换一种说法:

    从:
    http://example.com/resources/

    做一个

    POST选择ID以:
    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好(或适合成功删除的任何内容)

相关问题