我已经阅读了PUT vs. POST in REST,也阅读了w3 docs,但仍然不确定什么是正确的方法。
如果我要打开加热器:
POST /house/123/
{"appliance" : "heater" , "action" : "on"}
或
PUT /house/123/
{"appliance" : "heater" , "action" : "on"}
还是我应该使用其他方法?我认为他们俩都解决不了手头的问题,因为这里没有创建对象...
编辑:
如果我只是打开/关闭该怎么办。而是重新启动。认为这是需要发生的事情。不一定需要改变状态。
/house/123/
{"action" : "reboot-heater"}
答案 0 :(得分:2)
这两种方法在各种情况下都是合适的。
POST是通用方法-您可以 将其用于任何事物,尽管通常会有更好的选择(例如:在操作安全的情况下为GET)。 HTML仅支持GET和POST,它是网络的通用语言。因此,您可以推断出POST很好。
PUT也可以;它类似于“保存”,“替换”,“更新”。 PUT的问题在于语义是请求有效负载是目标资源当前状态的替换。
实际上,这意味着
PUT /house/123/
{"appliance" : "heater" , "action" : "on"}
应该完全代替/house/123
的状态。假设房子的状态包括其他电器,房间,居住者,位置等的描述,那可能不是您想要的。
您可以修补房屋,并用补丁文件描述对加热器的更改。但这放宽了幂等语义,这是PUT的重要优势。
您还可以将PUT放到其他目标资源上-但这可能不会给您合适的缓存行为。
重要的是,如果您想使框架正确,请考虑一下资源是集成域的一部分这一事实。 REST api伪装成服务器的伪装,伪装成愚蠢的HTTP键值存储。
如果有时间的话,最好读一本书RESTful Casuistry,那里的许多人讨论了请求服务器关闭的RESTful协议应该是什么。