我一直在阅读REST,我正在试图找出使用它的优点。具体来说,REST样式的URL有哪些优势,使得它们值得通过带有查询字符串的更典型的GET请求来实现?
为什么是这个网址:
http://www.parts-depot.com/parts/getPart?id=00345
认为不如此?
http://www.parts-depot.com/parts/00345
在上面的例子中(取自here),第二个URL确实更优雅,更简洁。但它需要付出代价......第一个URL很容易用任何Web语言实现,开箱即用。第二个需要额外的代码和/或服务器配置来解析值,以及额外的文档和花时间向初级程序员解释系统并向同行证明它。
所以,我的问题是,除了让网页看起来很酷的乐趣之外,RESTful网址对我来说有什么好处可以使用它们值得实施成本?
答案 0 :(得分:12)
希望如果你让你的URL引用一个名词,那么你将更有可能正确地实现HTTP动词。除此之外,一个URL与另一个URL完全没有优势。
现实情况是,URL的内容与RESTful系统完全无关。它只是一个标识符。
这不是它的样子,而是你用它做的事情很重要。
答案 1 :(得分:6)
查看REST的一种方式:
http://tomayko.com/writings/rest-to-my-wife(现在已被删除,遗憾的是,但仍然可以在web.archive.org上看到)
无论如何,HTTP-这个协议Fielding 而他的朋友们创造了 - 就是这样 将动词应用于名词。例如, 当你去一个网页,浏览器 对您键入的URL执行HTTP GET 进而来的是一个网页。
...
相反,大多数人都很忙 写复杂的层次 做这个东西的规格 一种不同的方式 有用的或雄辩的。名词不是 普遍的和动词不是 多态。我们扔掉了 几十年的实地使用和证明 技术并重新开始 看起来很像其他的东西 过去失败的系统。 我们使用的是HTTP,但仅仅因为它 帮助我们与我们的网络和 安全人少。我们正在交易 华而不实的工具和简单 向导。
答案 2 :(得分:5)
跳出来的一件事(顺便提一下好问题)就是他们所描述的。第一个描述操作(getPart),第二个描述资源(部分00345)。
另外,也许你不能在第一个使用其他HTTP动词 - 例如,你需要一个新的putPart方法。第二个可以重复使用不同的动词(如PUT,DELETE,POST)来“操纵”资源?我想你也有点说GET两次 - 一次用动词再次在方法中,所以第二种更符合HTTP协议的意图?
答案 3 :(得分:4)
我一直喜欢作为一个精明的网络用户,但当然不应该被用作何时使用这种URL方案的指导原则是那些类型的URL是“hackable”。特别是对于博客这样的东西,我可以在URL中编辑日期或页码,而不必找到“下一页”按钮的位置。
答案 4 :(得分:2)
REST IMO的最大优点是它允许使用HTTP Verbs(这是REST服务上最重要的)的干净方式。实际上,使用REST意味着您正在使用HTTP协议及其动词。
使用您的网址,并想象您想要发布“部分”,而不是获取它
第一种情况应该是这样的:
你正在使用GET,你应该使用帖子
http://www.parts-depot.com/parts/postPart?param1=lalala¶m2=lelele¶m3=lilili
在REST上下文中,它应该是
http://www.parts-depot.com/parts
和身体,(例如)像这样的xml
<part>
<param1>lalala<param1>
<param2>lelele<param1>
<param3>lilili<param1>
</part>
答案 5 :(得分:1)
URI语义由RFC 2396定义。与这个问题特别相关的摘录是3.3。 “路径组件”:
路径组件包含特定于权限的数据(或 如果没有权限组件,则计划,识别资源 在该计划和权力范围内。
3.4“查询组件”:
查询组件是要解释的信息字符串 资源。
请注意,查询组件不是资源标识符的一部分,它只是资源要解释的信息。
因此,您的第一个示例所标识的资源实际上只是/parts/getPart
。如果您的意图是URL应该标识一个特定的零件资源,那么第一个示例不会这样做,而第二个示例(/parts/00345
)则会这样做。
所以第二种URL的'优点'是语义正确,而第一种不是。
答案 6 :(得分:0)
“第二个需要额外的代码 和/或要解析的服务器配置 出价值,“
真的?那你选择一个糟糕的框架。我的经验是RESTful版本的代码量完全相同。也许我刚刚进入一个很酷的框架。
“以及其他文件 和解释系统的时间 对初级程序员“
只有一次。在他们得到它之后,你不应该再解释它。
“并向同行辩护。”
只有一次。在他们得到它之后,你不应该再解释它。
答案 7 :(得分:0)
不要在不是查询或搜索的网址中使用查询/搜索部分,如果您这样做 - 根据网址规范 - 您可能暗示某些您并不真正想要的资源。< / p>
将查询部分用于属于某个更大资源的子集的资源 - 分页是一个很好的例子,可以应用它。