Ruby on rails 何时使用GET vs PUT,如果键入PUT URI,会发生什么?

Ruby on rails 何时使用GET vs PUT,如果键入PUT URI,会发生什么?,ruby-on-rails,http,get,put,idempotent,Ruby On Rails,Http,Get,Put,Idempotent,这并不是Rails特有的,但我将使用Rails构造来问这个问题 TL;博士 当用户在地址栏中键入一个真正是PUT操作而不是GET的URI时,会发生什么 细节 假设我们有一个支持web的仪表,它在数据库中保存最近读取的值的副本以提高效率,但是用户可以请求更新以刷新缓存的值。下面是这些路线可能的样子: VERB | URI Pattern | Effect -----+-------------------+------------------------------------ GET

这并不是Rails特有的,但我将使用Rails构造来问这个问题

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

细节 假设我们有一个支持web的仪表,它在数据库中保存最近读取的值的副本以提高效率,但是用户可以请求更新以刷新缓存的值。下面是这些路线可能的样子:

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,并且结果永远不会改变。在的术语中,GET操作是幂等的。因此GET/gauge/33将获取gauge 33的缓存值

就我对RFC2616的理解而言,我必须使用PUT来更新本地状态,因为状态可以在每次调用时更改:它不是幂等的。说明了PUT/gauge/33/update在数据库中引起副作用的另一种方式

现在:如果我误解了RCF2616,请阻止我,我会悄悄躲开

问题 我的问题其实很简单:如果用户在浏览器的地址栏中键入/gauge/33/更新,会发生什么?这向服务器显示为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?

他们应该得到错误405

HTTP/405 wrong method
见:

这向服务器显示为GET/gauge/33/update,但没有与之匹配的路由

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

使用rails路径方法时,您希望将用户发送到show操作,而不是update方法。所以你们要用量具_path@gauge要生成路径,将生成/gauge/123,假设该路径是数据库中仪表的id。更新量表时,您唯一希望执行put的时间是在表单内,如下所示:

它将创建一个方法集为PUT的表单


更多信息。

我很抱歉-我的问题不清楚。我知道它确实加载了一个40倍的错误。我在问,从用户体验的角度来看,应该发生什么。引发一个40倍的错误并不是特别有帮助,所以添加一个GET方法是否合适?但我是否违反了RCF2616,因为它对DB有副作用?提出40倍的错误是正确的做法。应用程序中不应该有指向该路径的任何链接,因此,如果有人到达该路径,则会导致某种类型的错误的是意外行为。在这种情况下,会出现40倍的错误。