1

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

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

另一方面,重启不是“安全的”(也不一定是幂等的,但是机盖或调制解调器不仅仅是数据库中的一行),因此将机盖置于重启状态似乎更具语义,然后让服务器返回 202 以指示重新启动已启动并正在处理。

上周我一直在阅读 HTTP/1.1、REST、HATEOAS 和其他相关概念,所以我仍在整理这些内容。能否请一位经验丰富的开发人员权衡并确认或消除我的预感?

4

4 回答 4

3

GET 似乎不合适,因为正如您所说,期望 GET 是“安全的”。即除了检索之外没有任何动作。

PUT 似乎不合适,因为 PUT 预计是幂等的。即多个相同的操作会导致与单个操作相同的副作用。此外,通常使用 PUT将请求 URI 处的内容替换为请求正文。

POST 似乎在这里最合适。因为:

  1. POST 不一定是安全的
  2. POST 不必是幂等的

这似乎也很有意义,因为您正在发布重新启动请求(很像提交表单,这也通过 POST 发生),然后可以对其进行处理,可能会导致一个新的 URI 包含与303 See Other状态一起返回的重新启动日志/结果代码。

于 2012-08-30T23:59:45.803 回答
2

有趣的是,Tim Bray 写了一篇关于这个确切主题的博文(使用哪种方法告诉代表虚拟机的资源自行重启),其中他还主张使用 POST。在那篇文章的底部有关于该主题的后续链接,其中包括来自 Roy Fielding 本人的链接,他对此表示赞同。

于 2012-08-31T22:10:05.550 回答
1

Rest 绝对不是 HTTP。但是 HTTP 绝对不只有四个(或八个)方法。任何方法在技术上都是有效的(即使作为扩展方法),并且任何方法在自我描述时都是 RESTful 的——例如“LOCK”、“REBOOT”、“DELETE”等。像“MUSHROOM”这样的东西,虽然作为一个有效的HTTP 扩展,没有明确的含义或容易预期的行为,因此它不会是 RESTful。

Fielding 曾表示:“REST 风格并不表示限制方法集是可取的目标。[..] 特别是,REST 鼓励为晦涩的操作创建新方法”,并且“在真正的基于 REST 的架构中更有效,因为有一百种不同的方法具有不同的(非重复的)通用语义。”</p>

资料来源:

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

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

考虑到这一切,我将“自我描述”并使用 REBOOT 方法。

于 2012-09-15T21:03:23.953 回答
0

是的,您可以使用 POST 有效地创建一个新命令 REBOOT。但是有一种完全幂等的方法可以使用 PUT 进行重启

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

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

于 2014-02-16T23:03:05.620 回答