【问题标题】:RESTful way of having a single resource based on authentication基于身份验证的单一资源的 RESTful 方式
【发布时间】:2013-09-29 20:00:48
【问题描述】:

我有一个 API,它根据提供的身份验证(登录)提供帐户资源。由于一个用户只能有一个账号,而且只能看到自己的账号,看不到别人的账号,所以这个API在所有情况下基本上都是一个单一的资源API。

所以为了简单起见,我在网址 accounts/ 下有这个资源,当您访问 accounts/?username=dude&password=veryhard 时,您将获得您的帐户数据(如果您不提供身份验证,您将获得 403)。

现在我想知道这是否是 RESTful。此外,您应该能够更新您的帐户信息,我想知道 PUT 是否合适。据我所知,PUT 应该在资源的唯一 URI 上完成。那么,这是资源的唯一 URI 吗?通常,帐户的 URI 类似于 accounts/3515/,其中 3515 是帐户 ID。但是,用户不知道他们的帐户 ID。此外,应该有更多的登录方式,而不是用户名+密码,您还应该能够使用令牌(如accounts/?token=d3r90jfhda139hg)。那么我们得到了 2 个指向同一个资源的 URL,这对于 RESTful URI 来说也不是很漂亮,不是吗?

那么,什么是最 RESTful 的解决方案?还是我不应该这样做 RESTful?

【问题讨论】:

  • 你是在问4个问题,我建议你发布一个问题,这样我就可以用简洁有用的方式回复。
  • @dendini 这 4 个问题都有相同的上下文,我不喜欢创建多个问题并且必须为每个问题解释相同的故事。此外,一个答案可能会使其他问题过时。如果你愿意,你只能回答一个问题。如果这对我有帮助,我将不胜感激。

标签: api rest restful-architecture


【解决方案1】:

REST 纯粹主义者会认为使用/accounts/ 来获取单个帐户是不好的做法,因为它应该指定一个集合。相反,请考虑一个不会被误认为是 ID 的密钥,例如,如果您的 ID 是 UUID,则使用诸如“me”之类的令牌,因此您的 URL 是/accounts/me。这样做的好处是,如果以后您希望获得不同的帐户信息,例如您需要列出用户或者您有一个使用相同 API 的管理系统,那么您可以轻松扩展它。

将用户名和密码放在 URL 中也不是纯 REST。查询参数应与您获取的资源直接相关;通常过滤和限制返回的资源。相反,您应该认真考虑在加密 (HTTPS) 连接上使用 HTTP Basic 身份验证,以便将身份验证/授权和资源系统分开。如果您更喜欢使用令牌系统,请查看 oauth 或 hawk。

最后,是的,如果您使用 PUT,您应该提供完整的资源标识符。鉴于系统在更新数据之前读取数据是很常见的,因此缺少 ID 不会成为问题,因为它会作为先前 GET 的一部分返回。

【讨论】:

    【解决方案2】:
    1. 是的 accounts/?username=dude&password=veryhard 是正确的 REST URL。
    2. 如果 PUT 用于更新资源,则它与 ID 一起使用,如果您使用它来创建,则必须提供 ID。否则你使用 post 创建一个没有 id 的资源

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-13
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2011-02-07
      • 2023-03-15
      相关资源
      最近更新 更多