0

(这并不是 Rails 特有的,但我将使用 Rails 结构来提问)。

TL;博士

当用户在地址栏中键入一个真正是 PUT 操作而不是 GET 的 URI 时会发生什么?

细节

假设我们有一个支持 Web 的 Gauge,它将最近读取的值的副本保存在数据库中(为了提高效率),但用户可以请求更新以刷新缓存的值。所以这里的路线可能看起来像:

VERB | URI Pattern       | Effect
-----+-------------------+------------------------------------
GET  | /gauge/:id        | show the cached state of gauge #id
PUT  | /gauge/:id/update | update the cached state of gauge #id

我选择GET显示仪表的缓存状态,因为您可以执行任意数量的 GET 并且结果永远不会改变。在http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html的术语中,GET 操作是幂等的。因此GET /gauge/33将获取仪表 #33 的缓存值。

据我了解 RFC2616,我必须使用 aPUT来更新本地状态,因为状态可以在每次调用时更改:它不是幂等的。另一种说法PUT /gauge/33/update是在数据库中产生副作用。

现在:如果我误解了 RCF2616,请在此阻止我,我会悄悄溜走。

问题

我的问题很简单:如果用户/gauge/33/update在浏览器的地址栏中输入内容会发生什么?这向服务器显示为GET /gauge/33/update,但没有与之匹配的路由。

为相同的 URI 模式设置包含 GET 和 PUT 的路由是否常见?也就是说,我可以将路由表设置为:

VERB | URI Pattern       | Effect
-----+-------------------+------------------------------------
GET  | /gauge/:id        | show the cached state of gauge #id
PUT  | /gauge/:id/update | update the cached state of gauge #id
GET  | /gauge/:id/update | perhaps the same as PUT (but see below)

我对这种方法的担忧是,如果用户GET /gauge/33/update连续调用两次(或多次),服务器可能会决定——因为 GET 表示幂等操作——它实际上不需要执行更新。

我只是迂腐?还是我误解了 RFC2616?

4

2 回答 2

0

他们应该得到错误 405

HTTP/405 wrong method

见:http代码

于 2014-12-06T07:29:41.703 回答
0

它以 GET /gauge/33/update 的形式呈现给服务器,但没有与之匹配的路由。

如果没有路由,它只会加载 404 错误(或根据 Jasen 的 405)。您无法通过在浏览器的地址栏中键入地址来向服务器发送 PUT 请求。

使用 rails path 方法时,您希望将用户发送到 show 操作,而不是 update 方法。因此,您将使用gauge_path(@gauge)生成路径,这将导致/gauge/123(假设这是数据库中仪表的 id。您想要执行 put 的唯一时间是在更新仪表时的表单内,如下所示:

这将创建一个方法设置为 PUT 的表单。

查看此内容以获取更多信息。

于 2014-12-06T07:30:17.140 回答