触发动作 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 协议应该是什么。
我已阅读 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 协议应该是什么。