(这并不是 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?