2016-03-08 147 views
0

我有一個名爲Entity的集合,每個實體都有一個名爲groups的屬性。RESTful路由設計

{ 
    _id: xxx, 
    groups: [g1, g2, g3], 
    others... 
} 

一個實體至多有幾個組。這些團體不會改變很多,我不會將其存儲在單獨的集合中。一組數組對象如下所示:

g1 = { 
    group_id: xxx, 
    name: xxx 
} 

另外我有一個User集合。每個用戶都屬於1個實體和1個組。所以基本上我們有一個名爲user.entityuser.group的屬性,它引用上面剛好1個實體文檔。

當用戶想要獲得實體信息時,他可以做GET /entity/123。這很容易。實體組織呢?可能的選擇是

GET /entity/123/groupGET /group

方法1很簡單。您已經告訴人們您希望獲得實體123中的羣組。因此,您可以設置中間件以將123轉換爲req.entity,並直接返回entity.groups。但對於管理員,他可能想要查詢所有實體中的所有組,並且此API看起來不正確?

爲什麼方法2也可以的原因是因爲我得到req.user後,我可以檢查req.user.entity,查詢實體123並返回組。但我覺得我必須進行額外的條件檢查才能獲得團隊。同樣,如果管理員想要查詢所有組,我們只需要用不同的條件查詢,並且查詢條件可能很雜亂/

那麼這裏的更好的設計是什麼?有沒有比另一個更加RESTful的? (順便說一下1個用戶都只有1組和1個實體和user.entity永遠不會改變。)

回答

1

我工作的一個類似的項目,我的解決方案是您的兩個可能的選擇的混合物:

GET /group?entity_id=123 

通過這個,我可以通過entity_id直接訪問組,並且當entity_id丟失時(例如在管理員的情況下),可以返回所有groups

這種方法取決於你的groups是否嵌套在entities,或者他們是獨立的(即可以2個不同的entities有2個不同的groups具有相同的id?)。

如果他們是獨立的,你也可以這樣做:

GET /group/456 

以訪問一組直接通過它的ID。但是,如果您擁有2個具有相同ID的組,則此功能無效。在這種情況下,最好通過entity/:id/group

+0

來嵌套你的url,2個用例是這樣的。我的想法是有一天有人切換實體,或者每個人都屬於兩個實體,那麼簡單GET /組就很難。不知道是否需要考慮到這一點。 –