为什么在REST实现的URI中包含动作谓词会违反协议?

时间:2010-01-31 22:50:31

标签: rest restful-url

我发现有必要理解为什么在URI中包含动作谓词会违反REST协议的URI语法?当我阅读下面的文章时,我感觉有太多人对动词产生过多的噪音,并且他们应该对内容类型产生更多的噪音:

RestWiki: Minimum Methods

在完美的世界中,客户端浏览器都支持GET,POST,PUT和DELETE以进行请求操作。但是,只支持GET和POST,这意味着我们一直试图通过在URL中使用常见的动作谓词来识别应该是PUT和DELETE的操作,如视图,创建,编辑和删除。

这是如何违反REST架构原则的精神,以及通过将“删除”等内容放入网址而不是使用“删除”而遇到的障碍是什么?

2 个答案:

答案 0 :(得分:15)

围绕URI的指导唯一合理的原因是鼓励正确使用REST动词。如果请求根据HTTP标准执行与客户期望一致的操作,那么url包含的内容实际上并不重要。

根据名词命名网址可以自然地创建与GET,PUT,POST和DELETE的预期目的一致的行为。

当你在URL中放入动词时,它会变得非常混乱,因为http动词通常会与URL中的动词产生矛盾的行为。 REST规则说你必须尊重HTTP动词,但通常网址更具描述性,因此可能会产生误导。

浏览器仅支持HTTP谓词的子集这一事实并不真正相关,因为即使您拥有对所有HTTP谓词的完全访问权限,您仍然需要能够建模其他谓词,如打印,关闭,确认,取消。

在谈论REST实现时,人们需要更多地关注内容类型而不是URL结构。

让你的网址引用名词不是一个REST约束,而是鼓励人们陷入成功之中。

答案 1 :(得分:3)

REST不是协议,而是一种风格。因此,您可以自由地做任何符合您要求的事情。

如果可能,HTTP动词是首选,因为它们是HTTP协议的一部分,因此也是标准。它还允许您在标准Web服务器上使用现有的安全性和缓存层,而无需编写任何定制的中间件。

REST建议我们应该接受HTTP,而不是像SOAP,RPC或CORBA那样添加抽象层。添加额外的动词或将它们添加到URL可以看作是一种轻量级的抽象。

然而,正如您所提到的那样,浏览器或某些版本的Flash并未始终如一地支持这些内容。因此,如果您从客户端访问,可能需要将它们放在现实世界中的URL中。

您应该仔细查看,因为在URL上执行DELETE / PUT时可能存在严重的安全问题。

我建议动词GET POST PUT和DELETE几乎适合任何需要。您不应该需要任何新的动词或响应代码,因为它们是通用的。在请求和响应数据中添加更多信息。

查看此SO文章了解更多信息: Understanding REST: Verbs, error codes, and authentication