为什么使用DELETE / POST代替PUT来“取消关注/关注”用户?

时间:2017-04-10 20:12:24

标签: api-design httpverbs

参考此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。我觉得好像我没有抓住实际发生的事情 - 我们不是简单地在truefalse之间切换“跟随”的价值吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为数据库层必须以稍微复杂的方式实现,而不仅仅是“跟随”的布尔列。

鉴于您有三个用户,其中一个用户"following": true是什么意思?该用户是否遵循某些内容?仅这一点并不意味着用户正在关注所有其他用户,对吗?

数据库层可能包含(至少)两个不同的概念:用户和以下;用户包含有关用户的信息,以下内容指定用户彼此关注的内容。

假设我们有两个用户:

[
  {"username": "jake"},
  {"username": "jane"}
]

我们想说简跟随杰克,但不是相反。

然后我们需要一些东西来代表这个概念。我们称之为:

{"follower": "jane", "followee": "jake"}

当API讨论创建或删除以下内容时,这可能是他们想象的创建内容。这就是他们使用POST / DELETE而不仅仅是PUT的原因。它们不会修改用户对象,而是创建代表以下内容的其他对象。

他们在JSON API响应中有"following": true/false部分的原因是,当您询问有关特定用户的信息时, as 其他用户之一,您想知道是否您作为用户跟随该特定用户。

所以,鉴于上面的例子,当jane要求提供关于jake的信息时,在GET /api/profiles/jake,她会收到这样的信息:

{
  "profile": {
    "username": "jake",
    "bio": "...",
    "image": "...",
    "following": true
  }
}

然而,当 jake 会询问有关jane的个人资料信息时,他会得到此回复:

{
  "profile": {
    "username": "jane",
    "bio": "...",
    "image": "...",
    "following": false
  }
}

因此,他们列为API响应的信息不是数据库中实际存储的关于此特定用户的信息,它还包含一些根据提出问题的人计算的信息。

答案 1 :(得分:0)

使用microPUT肯定是一个合理的选择。我不认为任何人都能告诉你为什么随机API教程做出了某些设计决定。可能他们只需要一个人为的例子来使用POST / DELETE。

除非作者看到这个问题,否则我认为这是无法回答的。可以想象他们想要存储元信息,例如跟随状态变化的时间戳,但不受POST / DELETE与PUT的影响。