2014-03-19 55 views
4

我正在創建一個基於REST概念的API,但我仍然有點困惑,談論有關資源。如何管理REST API中3個資源之間的關係

我有一個網站,人們可以在多個組中註冊並選擇多個角色。例如,讓我們在公司註冊成爲場景的人:

公司

  1. Facebook的
  2. 谷歌
  3. 蘋果

角色

  • 營銷
  • 銷售
  • 發展
  • 客戶支持

所以,當我想創建一個新的公司,某些角色的用戶,我會通過像這樣成POST請求到/用戶端點

{ 
     "username" : "raffaele.izzia", 
     "email" : "[email protected]", 
     "groups" : [{ 
      "id" : 1, 
      "roles" : ["Sales","Customer support"] 
     }, 
     { 
      "id" : 2, 
      "roles" : ["Sales","Marketing"] 
     }] 
} 

使用這種方法,一旦我從API獲得一些用戶,我總是知道他們是哪個組/角色。

但是,請求/組端點上的請求呢?

如果我GET/groups/google我也應該收到有關用戶/角色的信息。因此,它可能是這樣的

{ 
    groups: [{ 
     "id" : 2, 
     "name" : "Google", 
     "users" : [2,3,4,10,35,50] //role will be included in the single resource once you expand this collection 
    }] 
} 

或也許這:

{ 
    groups: [{ 
     "id" : 2, 
     "name" : "Google", 
     "roles" : [{ 
      "name" : "Sales" 
      "users" : [2,3,4,10] 
     },{ 
      "name" : "Marketing" 
      "users" : [4,10,8,57] 
     }] 
    }] 
} 

你認爲是對這種關係的最佳解決方案?

回答

1

這是一個很好的問題。絕對是一個棘手的情況。

我認爲典型的REST式答案是用名詞和AKA資源來思考。即使你將這種三維連接視爲名詞之間的關係,連接本身也是一個名詞。 這就是你想讓你的REST API公開。

由於缺乏一個更好的詞,也許您的連接名是分配(或分配,或其他)。例如。 「在營銷中爲Google工作的Alice」是一項任務。

這現在開闢了新的可能性,應該讓你得到你需要的東西。

E.g.分配對象:

{ 
    "id": "...", 
    "user": {...}, // e.g. Alice 
    "group": {...}, // e.g. Google 
    "role": "Marketing" 
} 

和打水/users/alice/assignments回報她的所有任務的列表。

類似地,提取/groups/google/assignments返回在Google工作的人員的所有分配對象的列表。

這樣做的好處是,現在您的作業是真正的一流。你現在可以做一些事情,如跟蹤舊的作業,同時讓你的主要API只返回當前的作業。等(道具this answer靈感來自這裏。)

希望這會有所幫助!

+0

是的但在這裏我沒有看到羣/人/角色之間的聯繫。我的意思是,我們應該能夠通過電話回覆的內容是: - 給我Google和Facebook的所有營銷和銷售人員 - 給我某個用戶的所有角色 - 給我所有的人 現在我真的很簡單。只需一個簡單的資源,看起來像這樣 { 「ID」: 「...」, 「用戶」: 「愛麗絲」, 「組」: 「谷歌」, 「角色」: 「營銷」 } –

+1

我認爲這是對一個簡單的問題領域和包含層次結構的有用資源模型的建議的一個很好的探索,儘管OP顯然不理解你的建議。 –