【问题标题】:Change password of a user in a REST API在 REST API 中更改用户的密码
【发布时间】:2017-09-13 02:19:50
【问题描述】:

我正在开发一个小型 REST API。我的数据库中有一个包含此字段的用户资源:

{
  email: String,
  password: String,
  first_name: String,
  last_name: String,
  age: Number,
  location: String
}

出于安全原因,当我查询特定用户资源时,我将返回除 password 字段之外的所有字段。

现在我想在客户端制作一个表单,以便用户可以更新他的个人信息和密码。更改密码表单将有两个输入:old_passwordnew_password

我的疑惑来了。我想要一个 PUT 方法,这样我就可以发送所有字段并更新用户。但是old_passwordnew_password 很少会被填充,因此每次用户发出 PUT 请求时它们都无法发送到服务器。

  • 是否可以有时将这两个字段发送到 PUT 方法?它是 RESTful 的吗?

  • 另一种想法是使用带有这两个字段的 PATCH 方法,并且只更新用户密码。但是我的 PUT 方法没有更新用户密码,也没有正确使用?

哪种是最 RESTful 的方法? 谢谢。

【问题讨论】:

    标签: rest api


    【解决方案1】:

    是的,您可以在该值不存在时设置默认值,或使用服务器上的标志来检查该值是否存在。但是..,PUT 必须将完整的对象传递给资源。主要原因是 PUT 应该是幂等的。这意味着重复的请求应在服务器上评估为相同的结果。如果你允许部分更新,它就不能再具有幂等性了。

    使用允许您部分更新结构的 PATCH 方法。它提交对资源的部分修改。如果您只需要更新资源的一个字段,您可能需要使用 PATCH 方法。

    【讨论】:

    • 但有时您会更新完整的资源,有时则不会。这不是 RESTful 对吧?
    • Ok.. 那么,我需要有两种方法:PUT 用于更新完整资源和 PATCH 仅更改密码。这是我的主要想法,但是在 PUT 中您没有发送密码,因此您没有更新完整的资源。这样可以吗?
    • 是的,只要同一个用户没有多个条目就可以了。
    【解决方案2】:

    我们通过创建“密码”资源解决了这个问题。此资源的 URL 可能如下所示:

    /users/x/password
    

    仅支持 PUT。任何其他请求都将导致405 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2014-06-10
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多