REST - PUT(更新)资源状态

Xep*_*ris 0 rest design-patterns jax-rs

我已经考虑了一段时间,但无法将其环绕在我的脑海中。假设我有一个通过 REST 公开的任务系统。任务有自己的生命周期,例如:

CREATED -> ACTIVE   ->  PROCESSING -> CLOSED
   |          |               |
   |          |-->ESCALATED-->|
   |
    --> DISMISSED
Run Code Online (Sandbox Code Playgroud)

现在使用POST我通过提供正文有效负载中的所有信息来创建任务。

但现在我只需要更改任务的状态,也许添加评论。所以从理论上讲,PUT是要走的路——它正在更新资源。但事情是这样的:

PUT: /tasks/{taskId}?action=activate 似乎是合法的 URI,但是该操作已经有一个请求参数,可用于更改资源的状态 - PUT负载怎么样?对于这个端点的用户发送 0 长度消息的请求是否直观?

更新:

也很抱歉我的英语不好。我的意思是 -使用 URI 参数通过PUT请求更改资源状态,而不使用 BODY (Content-Lenght:0) 因此 URI: /tasks/32/ ?action=CLOSED更改“Task " 状态从PROCESSINGCLOSED

如果这是一个不好的做法 - 什么方法被认为是更好的做法?

Ped*_*eck 5

不,您不能这样做并调用您的应用程序 RESTful,原因有两个:

  1. URI 是原子标识符。您不能将查询字符串参数视为方法参数或具有与正文有效负载相同的语义。它们是标识符的一部分。

  2. PUT 要求服务器用提交的表示替换给定 URI 处的资源。您不能像现在一样使用 PUT 进行部分更新,而且绝对不能使用 PUT 在部分更新中应用查询字符串参数。

考虑到这一点,有几种选择可以被视为最佳实践:

  1. 您可以 PUT 整个表示,更改要更新的状态值。换句话说,您的客户端将发出 GET,更改文档中的值,并使用 PUT 将所有内容发回。

  2. 您可以 PATCH 将更改仅应用于状态值的差异文档。查看json-patch以获取与 PATCH 方法兼容的数据格式示例。

  3. 您可以向仅执行您想要的更改的专用端点发出 POST 请求,但您必须记录如何使用它。POST 提交要由目标资源处理的有效负载,因此您可以对它执行任何操作。