发出HTTP DELETE请求时,请求URI应完全标识要删除的资源.但是,是否允许添加额外的元数据作为请求的实体主体的一部分?
什么是删除多个项目的REST-ful方式?
我的用例是我有一个Backbone Collection,我需要能够一次删除多个项目.选项似乎是:
所有选项都不太理想.
这似乎是REST约定的灰色区域.
这样的事情可能吗?设计REST的人是否认为他们会永远删除一个东西?
所以,假设我有10个Foo的ID 1-10
我想通过一次HTTP DELETE调用删除ID的3,6和9.
在没有得罪教皇的情况下,我能做到这一点吗?
我阅读了很多关于PHP的Restful教程.
(我不想深入探讨为什么我不使用RoR.这是由于团队更熟悉PHP)
因为我们计划将来扩展到API,所以我认为实现Restful Web服务很重要.
我看了很多教程
http://www.gen-x-design.com/archives/create-a-rest-api-with-php/
显然宁静是为web服务.
网页怎么样?它们也可以是RESTFUL吗?
如果答案是否定的,请不要超出这条线并告诉我.谢谢.
我知道让网址看起来像RESTFUL网址就是简单地使用mod_rewrite.但是,我很确定,宁静的架构不仅仅是让网址看起来不错.
例如,我在名为list.php的网页上有一个项目列表.每个项目旁边都有一个删除链接.例如,list.php?id = 1&deleteitem
当有人点击list.php?id = 1&deleteitem链接时,我会回到同一个list.php文件并检查$ _GET中的param deleteitem.
如果检测到,我将根据$ _GET中的参数id从数据库中删除.
之后我将重定向回list.php没有任何参数.
我想知道,我如何使整个流程RESTFUL?
我问,因为在REST中,要删除一些你需要使用HTTP请求方法(DELETE).
很明显,在我的链接中,它们都很简单 <a href="list.php?id=1&deleteitem">Delete</a>
请赐教.
我的编程并不那么强大,如果给出的建议尽可能地成为外行,那将是很好的.
谢谢.
编辑
我有2个跟进问题.
问题1)由于这是一个带分页的项目列表,如果我想让它成为RESTful,URL会是什么样子?
问题2)因为我在列表中的每个项目旁边放置DELETE链接,我现在明白了,我应该使用
<form method="POST">
<input type=hidden name="_method" value="delete">
<input type="submit" >
</form>
Run Code Online (Sandbox Code Playgroud)
代替.
但表格应该张贴到哪里?项目网址?/项目/ {项目-ID}
但是我想回到这个列表页面,在成功删除数据库中的行后显示成功消息.
当我使用成功消息刷新此列表页面时,我还想避免弹出消息.
如果我发回这个list.php网址,那么它不是RESTful是吗?因为下面的答案我告诉我每个项目都是需要自己网址的资源.
请赐教.谢谢.
我有一个显示供应商产品的 API
我们的 UI 将允许用户选择各种过滤条件,并使用它一次删除大量产品。
问题是执行几千个单独的 HTTP 删除请求需要太长时间:
DELETE /api/supplier/6/products/5
DELETE /api/supplier/6/products/7
DELETE /api/supplier/6/products/8
DELETE /api/supplier/6/products/10
...
Run Code Online (Sandbox Code Playgroud)
目的是进行一次 HTTP 调用以一次删除一堆供应商产品。我可以将一个正文传递给删除,以便它包含我们要删除的所有 ID 的列表:
DELETE /api/supplier/6/products
Body:
{
"DeleteIds": "[5,7,8,10]"
}
Run Code Online (Sandbox Code Playgroud)
这很有效,直到我们把它放在我们的生产代理防火墙后面,它从 DELETE 请求中剥离了主体。
我看过 HTTP Spec RFC 2616 Fielding 等。并且它没有明确说明我不应该在 DELETE 请求中使用正文,进一步阅读表明发送带有 DELETE 请求的正文没有任何问题。
我可以控制我们的代理服务器,并且能够允许所有请求都通过正文,但我担心这可能不是最佳做法。我们可能有数千个要通过的 Id,我不希望我们使用标头或 URL 参数,因为我们可能会遇到长度限制。
所以我的问题是:使用请求正文 对多个产品进行删除的正确方法是什么?不仅仅是一个意见,而且是否有实际记录的证据来说明为什么我不应该使用 HTTP DELETE 的正文?
我应该继续
DELETE /api/supplier/6/products (Using a body)
Run Code Online (Sandbox Code Playgroud)
或者不应该将 DELETE 与正文一起使用,而是对类似的内容进行 POST
POST /api/supplier/6/products/deletemultiple
Run Code Online (Sandbox Code Playgroud)
编辑:在这个问题中有一些很好的辩论:删除一堆项目的宁静方式 它没有解决我关于使用 DELETE 请求的正文进行自定义删除操作的问题,但是有一些关于不同方式的很好的辩论可能会发生批量删除。
rest ×4
http ×3
api ×1
backbone.js ×1
c# ×1
http-delete ×1
php ×1
restful-url ×1
web-services ×1