2009-07-20 73 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,當它的標識符已知並且不需要查詢字符串時,在獲取特定資源的表示時是很好的。