2010-02-05 91 views
2

我目前將通過HTTP REST的API到在線服務,我面對的是一個非常簡單的問題,對此我無法找到滿足我一個答案REST接口用法:多個資源

我主要有2資源:「用戶」和「報告」,因爲你也能猜到報告關聯到用戶(一個且只有一個,在我的DB =外鍵)

無論如何,我有這個URL映射爲GET

  • mywebsite/api/users/{id}:返回用戶及相關信息離子,或用戶的列表,如果ID不存在
  • mywebsite/api/report/{id}:返回一個報告及相關信息,或報告的列表,如果ID不存在

現在我想獲得一個報告我現在這樣做的方法是爲GET方法添加一個可選參數以用於報告:?username={username},如果存在,我將篩選結果以僅返回此用戶的報告。

我不禁覺得有什麼是錯的......如果我開始做這樣的事情,我將有我的方法處理GET充滿的if/else尋找失蹤參數...

其他解決方案II想到的是:

  • 納入產生的GET報告上mywebsite/api/users/{id}但我有很多很多的報告,以便最終將成爲真正的壞...
  • 映射另一個URL只是這個功能,但它只是不覺得正確...

我剛剛掌握了這個REST的東西,我喜歡這個概念,但是關於這個問題的一點解釋能夠幫助我更好地理解它。

感謝

編輯:

看來我已經打了REST世界一個共同的問題,我都綁不住我的資源模型。如果將資源綁定到模型,最終會遇到聚合屬性問題。 有些傢伙在這裏描述了這個錯誤http://jacobian.org/writing/rest-worst-practices/但我還沒有理解如何來管理,他說......

僅供參考我使用Django /活塞,但這個問題應該交代無論任何語言。

回答

3

我忍不住想到有什麼問題......

你唯一做錯的事情就是認爲你的URI結構使得你的應用程序或多或少的RESTful。 original REST literature從不說查詢字符串不好。人們傾向於掛在URI結構上,似乎認爲您的URI必須以某種方式被構建爲被視爲RESTful。使用?username=<username>沒有任何問題。 URI只是一個ID(雖然有些可以比其他人更友善)

底線:不要掛斷你的URI如何看起來。還有更重要的事情要關注(促進超級鏈接/超媒體,堅持統一的界面 - 通常是HTTP,緩存等)。

這可能是一個很大的偏差,但至於你對資源耦合模型的評論,你還是沒問題。如果您確實使用了/ reports/ID/user路徑,只需將'user'視爲報告模型中的關係名稱即可。當然你的模型定義了報告和用戶之間的關係。你可以解析你的URI的最後部分,以便它匹配這個關係的名字。在一對一關係的情況下,就像您描述的那樣,將其始終設置爲Content-Location標頭以匹配用戶的規範URI。

例如。報告說,123所屬的用戶1.你現在有指該用戶的方式有兩種:

http://example.com/reports/123/user 
http://example.com/user/1 

對於第一個URI,它也將是設置Content-Location: http://example.com/user/1

一個好主意
2

這是我將如何實現這一點:

  • mywebsite/API /用戶:返回用戶的列表
  • mywebsite/API /用戶/(編號):返回一個用戶時,如果用戶的相關信息存在,否則404
  • mywebsite/API /用戶/ {ID} /報告:用於如果存在一個特定的用戶返回報告,否則404
  • mywebsite/API /用戶/ {ID} /報告/ {ID}:返回特定用戶的特定報告(如果存在),否則爲404

  • mywebsite/API /報告:返回的報告清單
  • mywebsite/API /報告/(編號):如果存在,則返回一個報告及相關信息,否則404

HTH,

-AJ