在基于 HATEOAS 的 REST 中处理只写资源 api

Handling write only resources in a HATEOAS based REST api

假设我有一个供我的用户使用的 REST 资源。如果客户端使用 GET 请求一个特定用户,api return 如下 json.

获取https://localhost:8080/api/user/xy

{
  "name": "John Smith",
  ...
  "_links": [{
      "rel": "self",
      "href": "https://localhost:8080/api/user/xy"
  },
  {
      "rel": "changepassword",
      "href": "https://localhost:8080/api/user/xy/password"
  }]
}

如您所见,api 提供了一个参考(在 _links 部分)到客户端可以更改密码的资源。我现在希望客户端在向此引用发送 PUT 请求时更新密码。

现在我的问题:

  1. 这是在基于 HATEOAS 的 REST api 中实现 use-case 之类 "change password" 的 good/correct 方法吗?或者有another/better方法吗?
  2. 修改密码成功后服务器return应该做什么?我可能希望状态 204 和一个空的 body.
  3. 我当然不想向用户显示他当前的密码。因此,如果客户端试图 GET 密码资源,我的服务器将 return 代码 405。在 REST api 中拥有 "write only" 资源通常有效吗?

... in a HATEOAS based REST api

首先,REST 暗示的少数约束之一是 HATEOAS 已经到位,因此 HTTP 客户端使用链接来推进其当前状态。不使用 HATEOAS 的客户端不是 REST 客户端,API 不包括提供 clinet 新状态可能性的链接也不是 RESTful API!

关于您的实际问题,它始终取决于您如何对某些事物建模。您可以使用 PUT 更新该字段,然后 return 一个 204 No Content 响应来指示该字段没有可读内容。根据 Spec

If the target resource does have a current representation and that representation is successfully modified in accordance with the state of the enclosed representation, then the origin server MUST send either a 200 (OK) or a 204 (No Content) response to indicate successful completion of the request.

return输入 204 No Content 状态代码符合条件。

另一种方法可以将旧密码发送到服务,以便服务首先根据提供的旧密码检查当前密码,然后才更新密码。如果您无论如何都不使用加密连接,这可能会阻止试图更改其他用户密码的攻击。但是,为了实现此验证检查,除非您将旧密码作为新状态的一部分,否则客户端无法再使用简单的 PUT 操作。这里 POST 可能更适合,因为它将语义留给了 API 的实现者。这可以保留最近 n 个密码的历史,新密码可能不是以前的密码。

HTTP 提供了 OPTIONS method a client can use to determine which operations are suitable for certain endpoints. Zac Stewart explained the usefulness of the OPTIONS method in regards to RESTful APIs in a blog post,也指出了当前许多 HTTP 服务器在使用 OPTIONS.

方面的不足

大多数 HTTP 框架将 return 405 Method Not Allowed 响应代码,以防使用默认情况下没有实现的操作调用端点。至少在 Java Spring MVC/Rest 数据或在某些端点提供的 JAX-RS 方法中,必须使用与 HTTP 方法对应的接口进行注释。使用现在具有等效注释方法的操作调用端点将自动生成 405 错误响应,尽管这可能取决于语言和框架。