参考此 API 教程/说明: https://thinkster.io/tutorials/design-a-robust-json-api/getting-and-setting-user-data
本教程解释说,要"关注用户",您将使用:
POST /api/profiles/:username/follow
.
为了"取消关注用户",您可以使用:
DELETE /api/profiles/:username/follow
.
用户配置文件最初拥有字段"following": false
。
我不明白为什么创建/删除"以下"字段(POST/DELETE)而不是从true
更新到false
。我觉得我好像没有掌握实际发生的事情——我们不是简单地在true
和false
之间切换"关注"的价值吗?
谢谢!
我认为数据库层必须以稍微复杂的方式实现,而不仅仅是使用用于"跟随"的布尔列。
假设您有三个用户,其中一个用户"following": true
意味着什么?该用户是否在关注某些内容?仅凭这一点并不意味着用户正在关注所有其他用户,对吗?
数据库层可能(至少)由两个不同的概念组成:用户和关注者;用户包含有关用户的信息,关注者指定用户彼此关注的内容。
假设我们有两个用户:
[
{"username": "jake"},
{"username": "jane"}
]
我们想说简在追随杰克,但不是相反。
然后我们需要一些东西来代表这个概念。让我们称之为以下内容:
{"follower": "jane", "followee": "jake"}
当 API 谈论创建或删除以下内容时,这可能是他们想象的正在创建的。这就是为什么他们使用POST/DELETE而不仅仅是PUT。它们不会修改用户对象,而是创建表示以下内容的其他对象。
他们的 JSON API 响应中具有"following": true/false
部分的原因是,当您作为其他用户之一询问有关特定用户的信息时,您想知道您作为用户是否关注该特定用户。
所以,给定上面的例子,当简询问有关杰克的信息时,在GET /api/profiles/jake
,她会收到这样的东西:
{
"profile": {
"username": "jake",
"bio": "...",
"image": "...",
"following": true
}
}
但是,当杰克询问有关简的个人资料信息时,他会得到以下回复:
{
"profile": {
"username": "jane",
"bio": "...",
"image": "...",
"following": false
}
}
因此,他们作为 API 响应列出的信息并不是数据库中实际存储的有关此特定用户的信息,它还包含一些根据提问者计算的信息。
使用 microPUT 肯定是一个合理的选择。我认为没有人能够告诉你为什么随机的API教程会做出某些设计决策。可能他们只需要一个人为的例子来使用POST/DELETE。
除非作者看到这个问题,否则我想它是无法回答的。可以想象,他们想要存储元信息,例如跟随状态更改的时间戳,但这不受 POST/DELETE 与 PUT 的影响。