0

我有用户,我有组

GET /user/1 -> {id:1,name:"john"}
GET /user/2 -> {id:2,name:"sam"}
GET /group/1 -> {id:100,name:"myGroup"}

显然,组对用户是多对多的关系。忽略存储实现,我试图找出最合理的方式来表示它。

/user/1/group // lists the groups of which "john" is a member, e.g. [100]
/group/100/user // lists the users who are members of "myGroup", e.g. [1]

一?另一个?两个都?

更进一步,如果我允许 sam 看到 john(但没有其他人),因为他们都是 100 组的成员,该怎么办?从概念上讲,LinkedIn 或 Facebook 同样允许您在连接后查看某人的信息。

因此,如果 john (1) 请求有关 sam (2) 的信息,我应该这样做:

/user/2 // allows it, with some backend mechanism finding the memberships of sam and john, and then finding that they are in the same group?

或者

/group/1/member/2 // this is john saying, "I want to access user 2 who is a member of group 1 and so am I"

第二个选项使请求解释为什么它们应该在一起,并使逻辑更简单。另一方面,用户 2 已经的资源/user/2,所以备用路线似乎很奇怪?

4

2 回答 2

1

首先,您的收藏应使用复数形式,例如:

/users
/groups

代表您的用户和组取决于您的业务,我会说您的“用户”是一等公民,所以应该是:

/users/{userId}/groups

这将返回由其标识的用户的所有组userId。请注意,/users/{userId}也可以返回用户的组,但这取决于您。

以下 URI 也可以使用,但话又说回来,这取决于您想要做什么:

/groups/{groupId}/users

更进一步,如果我允许 sam 看到 john(但没有其他人),因为他们都是 100 组的成员,该怎么办?从概念上讲,LinkedIn 或 Facebook 同样允许您在连接后查看某人的信息。

这可以通过某种访问控制列表 (ACL) 来实现。如果用户 A 因为不是朋友而看不到 B 的数据,则查询/users/B将不返回任何内容。但是,如果 C(B 的朋友)对 执行相同的请求/users/B,他将能够看到 B 的数据。

所以我会选择第一个选项。

于 2013-08-13T12:41:46.777 回答
0

我会考虑制作一个单独的资源,也许是 groupMemberships,它拥有这种关系。如果对您来说值得的话,您仍然可以使用 GET /users/1/groups 之类的东西直接获取组。

GET /groupMemberships?user=1
GET /groupMemberships?group=100

{
    "href": ".../groupMemberships/abc123"
    "user": {
        "href": "/users/1"
    }
    "group": {
        "href": "/groups/100"
    }
}
于 2013-08-13T12:30:24.427 回答