【问题标题】:Why use DELETE/POST instead of PUT for 'unfollowing/following' a user?为什么要使用 DELETE/POST 而不是 PUT 来“取消关注/关注”用户?
【发布时间】:2017-09-06 00:41:56
【问题描述】:

参考此 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 之间切换“关注”的价值吗?

谢谢!

【问题讨论】:

    标签: api-design httpverbs


    【解决方案1】:

    使用 microPUT 肯定是一个合理的选择。我认为没有人能够告诉您为什么随机 API 教程会做出某些设计决策。可能他们只是需要一个人为的例子来使用 POST/DELETE。

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

    【讨论】:

      【解决方案2】:

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

      假设您有三个用户,其中一个用户拥有"following": true 意味着什么?那个用户在关注什么吗?仅此一项并不意味着该用户正在关注所有其他用户,对吧?

      数据库层可能包含(至少)两个不同的概念:用户和关注者; users 包含有关用户的信息,follows 指定用户相互关注的对象。

      假设我们有两个用户:

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

      我们想说简正在关注杰克,但不是相反。

      那么我们需要一些东西来代表这个概念。让我们称之为以下:

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

      当 API 谈到创建或删除关注者时,这可能是他们想象中的创建。这就是他们使用 POST/DELETE 而不仅仅是 PUT 的原因。他们不会修改用户对象,而是创建其他代表以下对象的对象。

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

      因此,鉴于上面的示例,当 jane 在GET /api/profiles/jake 询问有关 jake 的信息时,她会收到如下信息:

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

      但是,当 jake 询问有关 jane 的个人资料信息时,他会得到以下响应:

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

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

      【讨论】:

      • 数据库层应该与API的设计考虑无关。 POST/DELETE 与 PUT 的语义仅与 API 层相关。
      • 我同意。我只是用它作为一个例子,也许它是一个笨拙的例子。在这种情况下,“关注”是与“用户配置文件”不同的概念,这当然也是链接示例试图告诉我们的内容。问题是我们是否不只是切换布尔值。这给了我一个想法,试图解释一个为什么他们谈到创建/删除关注者的原因,而不仅仅是为什么在发出关注请求之前和之后个人资料响应看起来不同。
      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 2010-10-21
      • 2015-02-17
      • 1970-01-01
      • 2015-05-03
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多