2009-07-20 70 views
2

我有一个Rails应用程序需要将数据库中的值作为Web服务公开 - 因为我使用的是Rails 2.x,所以我将使用REST(或至少尝试)。假设我的资源是香蕉,为此,我要揭露几个子的特点,考虑一下:这是RESTful吗?

- /banana   -> give a summary of the first 10 bananas, in full (all characteristics) 
- /banana/?name=<name>   -> give all characteristics for banana named <name> 
- /banana/?number=<number>   -> give all characteristics for banana number <number> 
- /banana/?name=<name>/peel   -> give peel data for banana named <name> 
- /banana/?number=<number>/length   -> give length data for banana number <number> 

要搜索的ID,只能。我有大约7个子特征可以揭露。这是RESTful吗?

感谢您的任何反馈!

回答

7

我会用这些:

  • /香蕉
  • /香蕉/嗒嗒
  • /香蕉/ 123
  • /香蕉/嗒嗒/剥离(和/香蕉/ 123 /剥离)
  • /香蕉/嗒嗒/长度(和/香蕉/ 123 /长度)

首先,对于RESTful的URI的通常的做法是/ OBJ ect_name/id/verb,其中一些缺席(但按照该顺序)。当然,这既不是必需的也不是预期的。

如果你所有的名字都不是由数字组成,你不必在/ banana/name/blah中明确地有name。实际上,如果有的话,最好有id作为标识符:/ banana/id/123/peel。希望这可以帮助。

+1

虽然这不是很直观,但我认为让所有香蕉123相关_under_/banana/123 /更合理 - 这种方法是否是一种有效的选择? – 2009-07-20 08:49:07

+0

你知道吗,我会同意你的说法,/香蕉/ 123 /长度的意义更大。事实上,我就是这样做的:)。 – pitr 2009-07-20 08:53:20

+0

嘿,也检查这篇文章:http://www.theamazingrando.com/blog/?p=107 – pitr 2009-07-20 08:57:10

0

在REST中,不使用查询参数是一种很好的做法,因为查询参数不属于URL,而在REST中,所有资源都应通过URL进行寻址。

在您的例子/香蕉/?name = 应该是/香蕉/ 因为你是指一个具体的资源。

即使我想/香蕉/?数= /长不好REST风格,因为你是通过URL选择的属性时,你应该检索与/香蕉全州/ 。与客户/ 1024 /地址不同可能会得到Customer 1024地址记录。

HTH。

2

参数只能用于表单提交。

此外,URI命名模式与REST完全无关。 REST的要点是通过超文本而不是带外约定来发现相关资源,并且只能从有限数量的入口点开始。因此,你的/香蕉/入口点可以提供10个香蕉的摘要信息,但它也必须为每个香蕉的细节资源提供URI,以及获得未来10个香蕉摘要的URI。其他任何东西都只是RPC。

10

Wahnfrieden在说什么叫Hypermedia as the Engine of Application State(HATEOAS) - Fielding定义的REST的一个中心约束。

简而言之,REST应用程序客户端本身不会构造URI。相反,它们遵循应用程序提供的URI。所以,诸如你所问的URI模板在最好的情况下是无关紧要的。如果你愿意,你可以让它们符合系统,但是REST没有提到你的URI需要怎么样。如果需要,可以对其进行排列,以便系统中的每个资源都可以从http://example.com/ {hash}获得。

发布URI模板(例如您在问题中讨论的URI模板)引入了应用程序和客户端之间的紧密耦合--REST试图阻止的事情。

理解超媒体驱动的应用程序的问题是几乎没有人用这种方式实现或记录他们的“RESTful”系统。

这可能有助于思考人与服务器之间通过浏览器进行交互。人只知道服务器通过浏览器提供的内容和链接。这是如何构建一个RESTful系统的。如果您的资源不公开链接,它们可能不是RESTful。

好处是,如果你想改变你的URI系统,例如,通过查询参数而不是嵌套URL显示Banana“Peel”属性,你可以在任何你想要的时间和任何客户端代码需要改变,因为它们不是为自己构建链接。

有关在REST中包含超文本驱动约束的系统示例,请查看Sun Cloud API

0

url中含有查询字符串的路由的更多可选形式是复数形式,因为可能在结果中返回多个项目。在这种情况下,香蕉如香蕉?颜色=黄色,听起来更合适。 另一方面,单数形式的香蕉,如香蕉/ 123,当它的标识符已知并且不需要查询字符串时,在获取特定资源的表示时是很好的。