【发布时间】:2023-03-21 10:52:01
【问题描述】:
我一直在思考这个问题,但无法将其缠绕在我的脑海中。 假设我有一个通过 REST 公开的任务系统。任务有自己的生命周期,例如:
CREATED -> ACTIVE -> PROCESSING -> CLOSED
| | |
| |-->ESCALATED-->|
|
--> DISMISSED
现在使用 POST,我通过在正文有效负载中提供所有信息来创建任务。
但现在我只需要更改任务的状态并添加注释即可。所以在所有理论上 PUT 是要走的路 - 它正在更新资源。但事情是这样的:
PUT: /tasks/{taskId}?action=activate 似乎是合法的 URI,但是该操作已经有一个可用于更改资源状态的请求参数 - PUT 有效负载呢?此端点的用户发送 0 长度消息的请求是否直观?
更新:
也很抱歉我的英语不好。我的意思是 - 通过 PUT 请求 ONLY 使用 URI 参数来更改资源的状态是否是一种好习惯,没有 BODY (Content-Lenght:0) 因此 URI :/tasks/32/?action=CLOSED 将“任务”状态从 PROCESSING 更改为 CLOSED。
如果这是一种不好的做法 - 哪种方法被认为是更好的做法?
【问题讨论】:
-
我不确定我是否明白这一点,但恕我直言,从 REST 的角度来看,您应该将资源与正文有效负载(如 POST)一起放置,而不是通过查询字符串传递数据;我假设查询字符串仅用于获取资源。
-
写完这篇文章 10 分钟后,我发现了这个 - stackoverflow.com/questions/7323958/… @ilpaijin - 感谢您的输入,但是上面的堆栈帖子呢?
-
我很抱歉我的英语不好,但我没有收到您的问题“上面的堆栈帖子”。
-
@ilpaijin 抱歉,我的意思是 stackoverflow 帖子:stackoverflow.com/questions/7323958/… 描述 POST 例如不一定必须有正文。
-
@Xeperis 该答案已过时,基于已过时的 RFC 2616。 POST 和 PUT 需要一个主体。在 POST 的情况下,您可以有一个空主体,其 mimetype 反映了这一点,但带有空主体的 PUT 在语义上等同于 DELETE。
标签: rest design-patterns jax-rs