触发动作 POST 或 PUT

Triggering an action POST or PUT

我已阅读 PUT vs. POST in REST in full and also w3 docs 但仍不确定什么是正确的方法。

如果我想打开加热器:

POST /house/123/

{"appliance" : "heater" , "action" : "on"}

PUT /house/123/

{"appliance" : "heater" , "action" : "on"}

或者我应该使用其他方法?我认为他们都没有解决手头的问题,因为这里没有对象创建...

编辑:

如果我只是转向 on/off 怎么办?而是重新启动。将其视为需要发生的事情。不一定需要改变状态。

/house/123/

{"action" : "reboot-heater"}

两种方法都适用,适用于各种情况。

POST 是通用方法 - 您 可以 将它用于任何事情,尽管通常有更好的选择(例如:GET,当操作安全时)。 HTML只支持GET和POST,是web的通用语。所以你可以推断 POST 是好的。

PUT 也有效;它类似于 "save"、"replace"、"upsert"。 PUT 的问题在于语义是请求负载是目标资源当前状态的替换

实际上,这意味着

PUT /house/123/

{"appliance" : "heater" , "action" : "on"}

应该完全替代/house/123的状态。这可能不是你想要的,假设房子的状态包括对其他电器、房间、居住者、位置等的描述。

你可以修补房子,用修补文件描述加热器的变化。但这放宽了幂等语义,而幂等语义是 PUT 的一个重要优势。

您也可以 PUT 到不同的目标资源 - 但这可能不会为您提供合适的缓存行为。

重要的是,如果您想在脑海中正确构思,请考虑资源是您的集成域的一部分这一事实。您的 REST api 是您的服务器所穿的伪装,伪装成一个愚蠢的 HTTP 键值存储。

如果你有时间,可以读一读 RESTful Casuistry,其中一群人讨论了请求服务器关闭的 RESTful 协议应该是什么。