2014-04-22 102 views
0

考慮到我使用下面的RESTful API端點:在RESTful API中處理嵌套資源的正確方法是什麼?

  • /用戶/:顯示所有用戶
  • /用戶/ $ USER_ID /:顯示特定用戶
  • /用戶/ $ USER_ID /職位/:顯示用戶所有帖子
  • /用戶/ $ USER_ID /職位/ $ POST_ID /:由用戶

約束在這個數據模型顯示具體職位:一個帖子總是有一個用戶。

「處理嵌套資源」我的意思是處理CRUD操作。

我應該在/用戶/ $ USER_ID /職位/端點實現CRUD操作(POST,PUT,PATCH,DELETE)或者我應該創建另一個端點/職位/和處理CRUD操作那裏,同時保持第一個端點只讀?

對不起,如果這個問題已經存在可能在另一種形式上SO。 :-) RESTful API中有很多「FUD」。

在此先感謝您的任何提示/澄清!

親切的問候, K.

回答

0

你應該實現對現有/posts//posts/$post_id/終端的操作。很少有很好的理由讓多個端點代表相同的資源。爲什麼讓他們弄清楚他們只能在/users/$user_id/posts/$post_id/上獲得,但必須去/posts/$post_id/刪除?

有時候,作爲

/users/: show all users 
/users/$user_id/: show specific user 
/users/$user_id/posts/: show all posts by user -- GET only 

/posts/: show all posts       -- All operations 
/posts/$post_id/: show specific post by user -- All operations 

他們使用/users/$user_id/posts/作爲非規範參考用戶帖子的人實現這一點。儘管我不能稱其爲錯誤,但最好每個資源都使用一個端點。過濾器參數並不那麼難。

+0

多個端點相同的資源不有道理沒有。但是有人在這個主題中提到的解決方案如何:http://programmers.stackexchange.com/questions/205418/what-is-the-proper-way-of-nesting-resources-in-rest-model雖然它不'如果能夠在多個端點上執行CRUD操作是有意義的,Javier的觀點確實有道理,不是嗎? 「POST/partners /:partner_id/tickets - 創建一張票並關聯到合作伙伴,使用新的URI返回201,格式爲/ tickets /:id」 – Braek

+0

@kristofvbk如果您想這樣做,沒有人阻止你。哈維爾的做法並非不合理。只要確保您在整個API中保持一致,並儘量減少重複。 –

0

Following Roy Fielding's clarification regarding REST我建議你不要擔心你的URL的設計:

一個REST API一定不能定義固定的資源名稱或層次結構(客戶端和服務器的一個明顯的耦合)。服務器必須有自由控制自己的命名空間。相反,允許服務器通過在媒體類型和鏈接關係中定義這些指令來指導客戶如何構建適當的URI,例如在HTML表單和URI模板中完成。 [這裏的失敗意味着客戶端由於帶外信息而假設資源結構,例如特定於領域的標準,這是面向數據的等同於RPC的功能耦合]。

測試API的RESTfulness的一個好方法是用統一的ID替換所有精心構造的URI並查看客戶端是否可以使用這些信息。如果不是,你依賴於帶外信息,並可以提高你的RESTfulness。但是類似於第n級數據庫規範化,爲了讓所有參與者都變得更容易,您可能希望採用更少的「正確性」。需要多少正確性取決於您的域的多變性以及您是否期望API用戶數量更少或更多。

如果你想編碼URI中的帶外信息,我會盡量限制所需的信息。由於/users/$user_id/posts/$post_id/需要用戶知道的三件事(URL設計,用戶ID,郵政ID),似乎有一些替代方案,將允許更多的無知;-)

  • /posts/$post_id:好,因爲你的用戶只會需要一個ID和資源類型,構建URI
  • /$resource_id:最好的,但需要在全球唯一的ID
相關問題