簡體   English   中英

這是RESTful嗎?

[英]Is this RESTful?

我有一個Rails應用程序需要將數據庫中的值作為Web服務公開 - 因為我正在使用Rails 2.x,我將使用REST(或至少嘗試)。 假設我的資源是Bananas,我想為其揭示幾個子特征,請考慮以下因素:

 - /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嗎?

感謝您的任何反饋!

Wahnfrieden所談論的是稱為超媒體作為應用程序狀態引擎 (HATEOAS)的東西 - 由Fielding定義的REST的核心約束。

簡而言之,REST應用程序客戶端永遠不會自己構造URI。 相反,它們遵循應用程序提供的URI。 因此,諸如您所詢問的URI模板充其量只是無關緊要的。 如果您願意,可以使它們符合系統,但REST沒有說明您的URI需要如何查看。 如果您願意,可以安排它,以便系統中的每個資源都可以從http://example.com/ {hash}獲得。

發布URI模板(例如您在問題中討論的模板)會引入應用程序和客戶端之間的緊密耦合 - 這是REST試圖阻止的。

理解超媒體驅動的應用程序的問題在於,幾乎沒有人以這種方式實現或記錄其“RESTful”系統。

通過瀏覽器考慮人與服務器之間的交互可能會有所幫助。 人類只知道服務器通過瀏覽器提供的內容和鏈接。 這就是構建RESTful系統的方式。 如果您的資源沒有公開鏈接,那么它們可能不是RESTful。

優點是,如果要更改URI系統,例如,通過查詢參數而不是嵌套URL公開Banana“Peel”屬性,您可以隨時執行此操作,並且不需要客戶端代碼因為他們沒有為自己構建鏈接而改變了。

有關在REST中包含超文本驅動約束的系統示例,請查看Sun Cloud API

我會用這些:

  • /香蕉
  • /香蕉/嗒嗒
  • /香蕉/ 123
  • / banana / blah / peel(和/ banana / 123 / peel)
  • / banana / blah / length(和/ banana / 123 / length)

首先,ReSTful URI的常見做法是/ object_name / id / verb,其中一些缺席(但按此順序)。 當然,這既不是必需的,也不是預期的。

如果您的所有名稱都不是數字,則不必在/ banana / name / blah中明確name名稱。 事實上,如果有的話,最好將id作為標識符:/ banana / id / 123 / peel。 希望這可以幫助。

參數只應用於表單提交。

此外,URI命名模式與REST完全無關。 REST的目的是通過超文本,而不是帶外約定,並且僅從極限數量的入口點使相關資源可被發現。 因此,您的/ bananas /入口點可能會提供10個香蕉的摘要信息,但它還必須為每個香蕉的詳細信息資源提供URI,以及獲取下10個香蕉的摘要的URI。 其他任何東西都只是RPC。

REST中的優良做法是不使用查詢參數,因為查詢參數不屬於URL,而在REST中,所有資源都應通過URL進行尋址。

在您的示例中/ banana /?name = name應為/ banana / name,因為您指的是具體資源。

即使我認為/ banana /?number = number / length不是很好的REST風格,因為當你應該使用/ banana / name檢索整個狀態時,你是通過URL選擇一個屬性。 可以使用/ customers / 1024 / address來獲取Customer 1024地址記錄。

HTH。

具有查詢字符串的url中的路徑的更多選擇形式是復數形式,因為可能在結果中返回多個項目。 在這種情況下,香蕉,如香蕉?顏色=黃色,聽起來更合適。 另一方面,單個形式的香蕉,如香蕉/ 123,在獲取特定資源的表示時,當其標識符已知且不需要查詢字符串時,是很好的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM