宁静的方式删除一堆物品

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

如果您使用http://example.com/resources/7HOU57Y DELETE,那意味着您正在删除该元素。

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

我有一个列表中的每个项目有一个checkbox。 一旦我select多个项目删除,我将允许用户按下一个名为DELETE SELECTION的button。 如果用户按下button,会popup一个js对话框,要求用户确认删除。 如果用户确认,所有的项目都被删除。

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

注意,目前DELETE在网页中,我所做的是我使用POST作为操作的FORM标记,但包括_method的值DELETE,因为这是什么是由SO在其他人指出如何做RESTful删除网页 。

我认为rojoca的答案是迄今为止最好的。 一个小的变化可能是,为了消除同一页面上的javascript确认,而是创buildselect并redirect到它,在该页面上显示确认消息。 换一种说法:

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

做一个

POSTselect的ID为:
http://example.com/resources/selections

如果成功的话,应该回答:

HTTP / 1.1 201创build,以及一个位置标题:
http://example.com/resources/selections/DF4XY7

在这个页面上,你会看到一个(javascript)确认框,如果你确认会做一个请求:

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

如果成功的话,应该回应:HTTP / 1.1 200 Ok(或者适合于成功删除的任何东西)

一种select是创build一个删除“交易”。 所以你POST到类似http://example.com/resources/deletes删除一个新的资源,包括一个资源列表将被删除。 然后在你的应用程序中,你只需要删除。 当您发布post时,您应该返回创build的交易的位置,例如http://example.com/resources/deletes/DF4XY7GET可以返回事务的状态(完成或正在进行)和/或要删除的资源列表。

我会说DELETE http://example.com/resources/id1,id2,id3,id4或DELETE http://example.com/resources/id1+id2+id3+id4 。 作为“REST是一个架构(…)[不]协议”引用这个维基百科文章,我相信,没有一个单一的方式来做到这一点。

我知道以上是不可能没有HTML与JS,但我觉得REST是:

  • 创build时不考虑像交易这样的小细节。 谁需要操作更多的单一项目? 这在HTTP协议中是有道理的,因为它不打算通过静态网页以外的任何其他服务。
  • 没有必要很好地调整到目前的模型 – 甚至纯HTML。

以下是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 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 

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

  1. 返回所有'foo'元素:

    [GET] api/foo

  2. 返回“富”元素与过滤特定的ID:

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

其中意义是URL,filter决定了“我们正在处理的是什么元素?”,而REST方法(在本例中为“GET”)则表示“如何处理这些元素?

  1. 因此修补多个logging将其标记为已读

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

..与数据foo [读] = 1

  1. 最后要删除多个logging,这个terminal是最合乎逻辑的:

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

请理解,我不相信这有什么“规则” – 对我来说这只是“有道理”

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

将DELETE发送到http://example.com/something ,在主体中使用xml或json编码的数据。

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