我和我的同事就正确的 HTTP 动词用于我们改变资源状态的操作之一进行了长时间的安静辩论。
假设我们有一个名为 WakeUpLan
的资源,它试图向网络中连接的系统发送事件。这是一种通用状态机,
{
id: 1,
retries: {
idle: 5, // after 5 retries it went to FAILED state
wakeup: 0,
process: 0,
shutdown: 0
},
status: 'FAILED',
// other attributes
}`
IDLE --> WAKEUP ---> PROCESS ---> SHUTDOWN
|
---->
[失败]
每个状态都有重试机制,即在IDLE
情况下,它会尝试x
次以transition
到WAKEUP
在 x
重试后,它消失并进入 FAILED
状态。
所有 FAILED
资源都可以再次手动重启或从某个界面重试一次。
因此,我们对哪种 HTTP 动词最适合这种情况感到困惑。
在我看来,这只是 status
的改变,并将重试计数重置为 0,以便我们的重试机制可以捕捉到这一点并在下一次迭代中尝试。
所以它应该是一个纯粹的PATCH
请求
PATCH 重试/{id}
{state: 'IDLE'}
但是我的同事反对将其作为POST请求,因为这是一个纯粹的 Action ,应该被视为POST。 我不相信,因为我们没有创建任何新资源,而只是更新我们的 REST 服务器已经知道的现有资源。
如果我在这里错了,我想知道并纠正。
欢迎提出任何建议。
提前致谢。
最佳答案
Any suggestions/advices are welcome.
REST architectural style 的引用实现是万维网。万维网建立在 URI、HTTP 和 HTML 的基础之上——HTML 表单处理仅限于 GET
和 POST
。
因此 POST
必须是 可接受的答案。毕竟,网络取得了灾难性的成功。
PATCH
与 PUT
一样,允许您将更改传达给资源的表示形式。语义比 POST 更具体,这允许客户端更好地利用。因此,如果您所做的只是创建一条消息来描述对资源表示的本地编辑,那么 PATCH 是一个不错的选择。
不要忽视 PUT 的可能性——如果资源的完整表示的大小与 PATCH 文档的表示大致相同,那么使用 PUT 可能是更好的选择,因为 idempotent semantics .
I am not convinced because we are not creating any new resource but just updating existing resource that our REST server already knows about it.
POST 比“创建新资源”更通用。从历史上看,围绕这一点存在很多混淆(早期 HTTP 规范中的语言没有帮助)。
关于rest - 用什么PATCH或POST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56435137/