rest - 用什么PATCH或POST?

标签 rest http state-machine

我和我的同事就正确的 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 次以transitionWAKEUPx 重试后,它消失并进入 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 表单处理仅限于 GETPOST

因此 POST 必须是 可接受的答案。毕竟,网络取得了灾难性的成功。

PATCHPUT 一样,允许您将更改传达给资源的表示形式。语义比 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/

相关文章:

java - 在 Java RESTful 资源中获取用户信息

javascript - 从 angularjs 调用 RESTful 服务的正确方法

php - 使用PHP获取不自动解码的http url参数

java - Akka 有限状态机实例

messaging - Lamport 时钟和状态机

rest - VCenter:REST API:如何将 ova 上传到内容库

javascript - 可以通过浏览器访问远程 json 组件,但不能通过 $.getJSON() 以编程方式访问

security - 网络抓取工具能否绕过良好的 throttle 保护?

http - Squid url 将 https 重写为 http

go - Ragel 转换 Action 和状态 Action 之间的区别