用于删除一组项的Restful方法

用于删除一组项的Restful方法,rest,Rest,在 这表明,如果使用DELETE,则意味着您正在删除整个集合 如果使用DELETE,则表示正在删除该元素 我在做一个网站,注意不是网络服务 我有一个列表,列表中的每个项目都有一个复选框。一旦我选择了多个要删除的项目,我将允许用户按下一个名为DELETE SELECTION的按钮。如果用户按下按钮,将弹出一个js对话框,要求用户确认删除。如果用户确认,则删除所有项目 那么,我应该如何以RESTFUL方式删除多个项目呢 注意,目前对于网页中的删除,我所做的是使用表单标记和POST as action

在 这表明,如果使用DELETE,则意味着您正在删除整个集合

如果使用DELETE,则表示正在删除该元素

我在做一个网站,注意不是网络服务

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

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


注意,目前对于网页中的删除,我所做的是使用表单标记和POST as action,但包括一个_方法,该方法的值为DELETE since。

一个选项是创建一个删除“事务”。因此,您将
发布到类似
http://example.com/resources/deletes
由要删除的资源列表组成的新资源。然后在应用程序中,只需执行删除操作。当您发布时,您应该返回您创建的事务的位置,例如,
http://example.com/resources/deletes/DF4XY7
。获取此信息可以返回事务的状态(完成或进行中)和/或要删除的资源列表。

我可以说是删除或删除。正如“REST是一种架构(…)[不是]协议”引用这篇维基百科文章所说的那样,我相信,没有一种方法可以做到这一点

我知道如果没有带HTML的JS,上述内容是不可能的,但我感觉REST是:

  • 创建时不考虑事务等小细节。谁将需要对不止一个项目进行操作?这在HTTP协议中是合理的,因为除了静态网页之外,它不打算通过它提供任何其他服务
  • 没有必要很好地适应当前的模型——即使是纯HTML

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

在正文中使用xml或json编码的数据将DELETE发送到

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

我认为是目前为止最好的。一个微小的变化可能是,在同一页面上取消javascript确认,而是创建选择并重定向到它,在该页面上显示确认消息。换言之:

发件人:

做一个

将所选ID发布到:

如果成功,应以以下方式回应:

已创建HTTP/1.1 201,并将位置标头发送到:

在此页面上,您将看到一个(javascript)确认框,如果您确认,该框将执行以下请求:

删除

如果成功,应以以下方式回应:
HTTP/1.1 200 Ok(或任何适合成功删除的方法)

有趣的是,我认为相同的方法适用于修补多个实体,需要考虑我们的URL、参数和REST方法的含义

  • 返回所有“foo”元素:

    [GET]api/foo

  • 返回带有特定ID筛选的“foo”元素:

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

  • 其中,sense是URL,过滤器确定“我们正在处理哪些元素?”,REST方法(在本例中为“GET”)表示“如何处理这些元素?”

  • 因此,修补多个记录以将其标记为已读

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

  • ..数据foo[read]=1

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

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


  • 请理解,我不认为在这方面有任何“规则”-对我来说,这只是“有意义的”

    以下是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))
    
    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
    
    请求:

    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>           
    
    批量请求:

    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
    
    正如和所说,最规范的方法是使用虚拟资源来删除资源选择,但我认为从REST的角度来看这是不正确的,因为执行
    deletehttp://example.com/resources/selections/DF4XY7
    应删除选择资源本身,而不是所选资源

    对于or,我只有一个异议:传递ID数组有一种更规范的方法,使用数组运算符:

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


    通过这种方式,您攻击的是删除集合终结点,但以正确的方式使用查询字符串过滤删除。

    我也遇到过删除多个项目的相同情况。这就是我最后做的。我使用了删除操作,要删除的项目的ID是HTTP头的一部分

    以原子方式执行这些删除是否至关重要?如果第31个项目无法删除,您真的想取消前30个项目的删除吗?@Darreller问得好。我认为如果以原子方式执行删除,效率会降低。因此,我倾向于从tablename中删除ID({list of ID})。如果有人能告诉我这是个好主意还是纠正我。我们将不胜感激。此外,如果删除了第21个项目,我不要求前20个项目的删除顺序相反。如果有人能告诉我需要反转与不需要反转方法的区别,我再次表示感谢。注意:“in”条款可能有限制;例如,在Oracle中,最多可以放置1000个ID。Google的API设计指南提供了一种在REST API中创建自定义(批处理)操作的解决方案,请参见我的回答:与数据库无关。我所说的事务只是指要执行的操作列表。在本例中,它是一个删除列表。您要做的是在应用程序中创建一个新的(删除)列表作为资源。您的web应用程序可以以任何方式处理该列表