GET或PUT重启远程资源?

时间:2012-08-30 21:42:14

标签: api http rest get put

我正在努力(在某种意义上)确定哪种HTTP方法更适合重新启动远程资源:GET或PUT?

一方面,调用http://tools.serviceprovider.net/canopies/d34db33fc4f3?reboot=true似乎更具语义性,因为人们可能希望获得新重新启动的树冠的表示。

另一方面,重启不是'安全'(也不一定是幂等的,但是天篷或调制解调器不仅仅是数据库中的一行)所以将天篷变为状态似乎更具语义性重新启动,然后让服务器返回202以指示重启已启动并正在处理。

上周我一直在阅读HTTP / 1.1,REST,HATEOAS和其他相关概念,所以我仍然把各个部分放在一起。一个经验丰富的开发人员可以权衡并确认或消除我的预感吗?

4 个答案:

答案 0 :(得分:3)

GET似乎不合适,因为像你说的那样,预期GET是“安全的”。即没有检索以外的任何行动。

PUT似乎不合适,因为预期PUT是幂等的。即,多个相同的操作引起与单个操作相同的副作用。此外,PUT通常用于用请求体替换请求URI中的内容。

POST最合适。这是因为:

  1. POST不一定安全
  2. POST不一定是幂等的
  3. 它也显得有意义,因为你正在发布重启请求(很像提交表单,也可以通过POST发生),然后可以处理,可能会导致新的URI包含重启日志/结果返回使用303 See Other状态代码。

答案 1 :(得分:1)

有趣的是,Tim Bray在这个确切的主题上写了一个blog post(用于告诉代表虚拟机重新启动的资源的方法),他也在争论POST。在该帖子的底部有关于该主题的后续链接,其中包括罗伊菲尔丁本人的一个人,他同意这一点。

答案 2 :(得分:0)

休息绝对不是HTTP。但HTTP肯定不只有四种(或八种)方法。任何方法在技术上都是有效的(即使作为扩展方法),并且当自我描述时,任何方法都是RESTful - 例如'LOCK','REBOOT','DELETE'等等。 MUSHROOM'虽然作为HTTP扩展有效,但没有明确的含义或容易预期的行为,因此它不会是RESTful。

菲尔丁表示“REST风格并不意味着限制这套方法是一个理想的目标。 [..]特别是,REST鼓励创建用于模糊操作的新方法“并且”它在真正的基于REST的体系结构中更有效,因为有一百种不同的方法具有不同的(非重复的)通用语义。”

来源:

http://xent.com/pipermail/fork/2001-August/003191.html

http://tech.groups.yahoo.com/group/rest-discuss/message/4732

考虑到这一切,我将成为'自我描述'并使用REBOOT方法。

答案 3 :(得分:0)

是的,您可以使用POST有效地创建一个新命令REBOOT。但是有一个perfectly idempotent way to do reboots using PUT

有一个last_reboot字段,其中包含服务器上次重新启动的时间。如果传入时间比当前时间短,则使用当前时间对该字段进行PUT导致重新启动。如果中间服务器重新发送PUT,没问题 - 它与第一个命令具有相同的值,所以它是一个无操作。尝试向后设置last_reboot时间是一个错误。

您可能希望从正在重新启动的服务器获取当前时间,除非您知道客户端和服务器已合理地按时间同步。