【问题标题】:Proper REST API design for like dislike and unvote适当的 REST API 设计,用于不喜欢和不投票
【发布时间】:2022-01-26 21:31:01
【问题描述】:

我有一个系统,登录的用户可以对帖子投票喜欢或不喜欢。如果他们试图点赞一个已经被点赞的帖子,他们将删除该帖子的投票。同样适用于不喜欢。作为一个 REST 新手,我正在尝试为此提出一个 url 方案,这很令人困惑

目前,我的网址是这样的

POST /news/vote/social/:feedItemId/:vote(like|dislike|reset)

一个端点正在做所有事情,登录用户才是真正可以投票的用户

在阅读了有关 stackoverflow 的其他一些答案后,似乎还有其他可能性,例如

PUT /news/vote/social/:feedItemId/(like|dislike)
DELETE /news/vote/social/:feedItemId

我已经看到其他答案,其中 userId 也包含在 url 中,因为它说 REST API 设计不应该反映有状态

PUT /news/vote/social/feedItemId/:userId/(like|dislike)
DELETE /news/vote/social/:userId/:feedItemId

这些 url 的问题是任何人都可以更新任何 userId 的投票,除非涉及一些后端检查

我的问题是,考虑到只有登录的人应该只能更新他们的投票,处理这些问题的正确方法是什么?

【问题讨论】:

  • unless some backend check is involved必须参与,否则您的 API 中存在安全漏洞

标签: api rest api-design url-design


【解决方案1】:

听起来你应该看看Custom Methods

由于这是每个用户的操作,因此使用自定义方法来支持和反对投票是非常有意义的,其中每个方法都充当 +1 或 -1 的切换。例如:

  • POST /items/1234:upvote 在新帖子上会添加 +1(点数=1)
  • POST /items/1234:upvote 再次在同一个帖子中将取消投票(积分=0)
  • POST /items/1234:downvote 在同一个帖子中再次添加 -1 (points=-1)
  • POST /items/1234:downvote 再次在同一个帖子中将取消反对票(点数=0)。

一个额外的考虑是以下顺序:

  • POST /items/5678:upvote 会将分数提高到 1。
  • POST /items/5678:downvote 紧随其后将取消赞成票并应用反对票,从而将分数从 +1 变为 -1。

(反之亦然)

您提到这需要一些后端检查,这是绝对正确的。如果您在 API 中实现任何用户,只要他们知道用户 ID,任何其他用户都可以对其投赞成票或反对票,那么您就会面临安全风险。因此,处理此问题的正确方法是在用户登录后使用后端从会话中提取用户 ID(而不是从任何人都可以填写他们所代表投票的用户的空白的 URL 中)的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2013-04-03
    相关资源
    最近更新 更多