我正在使用FLEX 3向Rails 3发出XML请求。由于FLEX 3仅提供POST和GET,我必须使用“?_method = PUT”黑客来维护正确的RESTful:
http://127.0.0.1:3000/locator/locator_users/1.xml?_method=PUT
在服务器端,它显示为POST,我得到一个ActionController :: RoutingError(无路由匹配)。
我做了一个rake路线,路线在那里,正确命名空间和所有。 这与Rails 2一起运行良好,所以我有理由相信它必须是Rails 3改变了。在做了一些搜索之后,人们似乎已经表明应该仍然有效。但是,这不适合我。任何人都可以确认或否认Rails 3的兼容性吗?
更新
好吧,经过一些修补之后,我认为这实际上是Flash Player 10的一个问题.Flash PLayer 9似乎与“_method =”hack一起工作正常,10则没有。看到我写的这篇新帖子(Flash Player 9 vs Flash Player 10 with FLEX 3, ?_method=PUT/DELETE not working?)。
答案 0 :(得分:4)
部分原因是Rack::MethodOverride
的行为。它不会检查_method
的查询参数,因此对此http://127.0.0.1:3000/locator/locator_users/1.xml?_method=PUT
的调用不会被正确覆盖。
我写了一个piece of Rack middleware替换它来解决这个问题。
你所要做的就是
将其添加到Gemfile
gem 'rack-methodoverride-with-params'
在config/environment.rb
config.middleware.swap Rack::MethodOverride, Rack::MethodOverrideWithParams
答案 1 :(得分:1)
如果您可以在请求正文中添加_method=PUT
,则无需更换机架中间件。
如果你不能这样做,那么我会遇到另一个(影响力较小)的解决方案,即简单地定义一个自定义路线来完成你正在寻找的东西,例如:
# config/routes.rb
post '/locator/locator_users/:id', to: 'locator_users#update', constraints: {_method: 'POST'} # allow http method override
当然,您必须为您需要HTTP方法覆盖的每个资源添加此路由,但如果您希望限制您对潜在怪异的暴露,这可能是一件好事,因为这会破坏HTTP语义。
编辑:如果需要,您可以使用GET请求执行相同的操作,只需将post
替换为get
(如果您需要支持REST over JSONP,这可能很有用)。
答案 2 :(得分:0)
您可能需要重写向服务器发出请求的方式。我一起使用Rails 3,Flex 4和Flash 10(但使用在Flex 3中开发的应用程序)并使用_method
作为我的HTTPService
对象中的参数(将内容类型保留为默认application/x-www-form-url
)。
HTTPService
仅支持GET
和POST
次请求。如果在HTTPService对象上使用set useProxy
属性为true,则可以使用HEAD
,OPTIONS
,TRACE
和DELETE
,但前提是使用基于服务器的代理服务。如果这不起作用,那么您可能需要尝试URLLoader
或URLRequest
或实施自己的自定义解决方案。