用户基本上可以将其他用户添加为朋友。所以,我不是在创建另一个用户资源,而是链接两个资源。
问题
- 处理这个问题的最佳策略是什么?
- 这种情况下合适的动词是什么?
听说有一个LINK
动词,好像很合适。
而且我还读到,我可以使用PATCH
动词来对资源应用补丁。
如果是这样,我可以这样做吗
PATCH /users/{id}/friends
用户基本上可以将其他用户添加为朋友。所以,我不是在创建另一个用户资源,而是链接两个资源。
问题
听说有一个LINK
动词,好像很合适。
而且我还读到,我可以使用PATCH
动词来对资源应用补丁。
如果是这样,我可以这样做吗
PATCH /users/{id}/friends
您可能会考虑创建一个新对象。
如果您分离出一个friendship
对象,您将能够在不更新用户的情况下创建和修改它们。每个友谊将有两个用户密钥。这也是一个悬挂有关友谊的额外信息的好地方,例如“朋友以来”的价值。
POST /friendships
{
primaryUser: 43,
secondaryUser: 3
since: "03/16/2010"
}
201 CREATED
location: /friendships/635
然后可以编写对用户 43 的查询以包括用户 ID、友谊 ID 或嵌入对象的数组。
GET /users/43
200 SUCCESS
{
id: 43,
name: "john",
friends: [3]
}
或者
200 SUCCESS
{
id: 43,
name: "john",
friends: [635]
}
或者
200 SUCCESS
{
id: 43,
name: "john",
friends: [
{
id: 635,
primaryUser: 43,
secondaryUser: 3,
since: "03/16/2010"
}
]
}
更新/删除的语义更加直接。“删除”友谊看起来DELETE
比 aPATCH
或PUT
imo 更好。
“链接资源”实际上只是意味着“更新一个资源以包含指向另一个资源的链接”。
这意味着您应该使用包含对资源 B 的新引用的新表示向资源 A 发出 PUT 或 POST。
如果它是双向关系,那么通过在资源 A 上进行 PUT/POST,您还应该在下次获取资源 B 时看到对 A 的引用。