当前位置:  开发笔记 > 编程语言 > 正文

删除一堆项目的宁静方式

如何解决《删除一堆项目的宁静方式》经验,为你挑选了5个好方法。

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

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

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

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

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

注意,目前对于网页中的DELETE,我所做的是使用带有POST作为操作的FORM标签,但是包含值为DELETE的_method,因为这是其他人在SO中指示如何对网页进行RESTful删除.



1> rojoca..:

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


与您的数据库无关。事务是指要执行的操作的列表。在这种情况下,这是一个删除列表。您要做的是在应用程序中创建一个新列表(删除列表)作为资源。您的Web应用程序可以根据需要处理该列表。该资源具有URI,例如http://example.com/resources/deletes/DF4XY7。这意味着您可以通过该URI的GET检查删除状态。如果在执行删除操作时必须从Amazon S3或其他CDN中删除图像,并且该操作可能需要很长时间才能完成,这将很方便。
+1这是一个很好的解决方案.@rojoca不是向每个资源发送DELETE,而是建议创建一种新类型资源的实例,其唯一任务是删除资源列表.例如,您有一组用户资源,并且您希望从集合中删除用户Bob,Dave和Amy,因此您创建一个新的删除资源,将Bob,Dave和Amy作为创建参数进行POST.删除资源已创建,表示从Users集合中删除Bob,Dave和Amy的异步过程.
@rojoca是的,我认为问题是HTTP非常'删除是用于删除单个资源'.无论你做什么,多次删除都是一种黑客攻击.您仍然可以向客户端返回一份"工作",说明正在处理此任务(并且可能需要一些时间)但是使用此URI来检查进度.我阅读规范并认为DELETE可以有一个正文,就像其他请求一样.

2> Decent Dabbl..:

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

来自:http:
//example.com/resources/

做一个

选择ID的POST:http:
//example.com/resources/selections

如果成功,应该回复:

已创建HTTP/1.1 201,并且位置标头为:http:
//example.com/resources/selections/DF4XY7

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

删除http://example.com/resources/selections/DF4XY7

如果成功,应该响应:HTTP/1.1 200好(或适合成功删除的任何内容)


@fireeyeboy这两步法似乎是执行多重删除的常用方法,但为什么呢?为什么不简单地向诸如`http:// example.com/resources/selections /`之类的uri发送DELETE请求,并在请求的有效负载(正文)中发送您要删除的项目的数据.据我所知,没有什么可以阻止你这样做,但我总是遇到"但它不是RESTfull".
DELETE可能会使HTTP基础结构忽略正文:http://stackoverflow.com/questions/299628/is-an-entity-body-allowed-for-an-http-delete-request

3> Luka Žitnik..:

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



    true
    
         Key
         VersionId
    
    
         Key
    
    ...
           

但Facebook Graph API,Parse Server REST API和Google Drive REST API甚至可以让您在一个请求中"批量"执行单个操作.

这是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



4> Maciej Piech..:

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

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

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

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



5> fezfox..:

有趣的是,我认为相同的方法适用于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

    最后要删除多条记录,这个端点最合乎逻辑:

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

请理解我不相信对此有任何"规则" - 对我来说它只是"有意义"

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有