我在Ruby on Rails 3中有一个控制器方法,它接受application/JSON作为内容类型。这一切都符合预期,但我实际上不希望rails自动解析POST请求正文中的JSON。此方法充当网关,只是将信息穿梭到队列中,并且可能相当大。我不想浪费时间将数据处理到@_params中,因为这是不必要的。
我相信我可以通过将请求头部中的content-type设置为其他值来解决这个问题,但我希望对HTTP请求的语义是正确的。
如何禁用此功能?
编辑:更具体地说,我如何仅为这一条路由编辑此功能?
发布于 2012-05-03 23:40:28
参数解析在actionpack的lib/action_dispatch/middleware/params_parser.rb
中进行得非常深入。
我会说,你最好的办法就是用Rack截取请求,就像这样。
在lib/raw_json.rb
中
module Rack
class RawJSON
def initialize(app)
@app = app
end
def call(env)
request = Request.new(env)
if request.content_type =~ /application\/json/i
# test request.path here to limit your processing to particular actions
raw_json = env['rack.input'].read
env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'
env['rack.input'] = StringIO.new("raw_json=#{raw_json}")
end
return @app.call(env)
end
end
end
在config.ru
中,在调用run <your app name>::Application
之前插入以下内容
require 'raw_json'
use Rack::RawJSON
发布于 2012-09-28 18:52:07
它可能是内置的,但请看一下代码:
module ActionDispatch
class ParamsParser
DEFAULT_PARSERS = {
Mime::XML => :xml_simple,
Mime::JSON => :json
}
def initialize(app, parsers = {})
@app, @parsers = app, DEFAULT_PARSERS.merge(parsers)
end
[ ... ]
strategy = @parsers[mime_type]
因此,如果您可以安排将哈希发送到此初始化器,则可以添加或覆盖默认设置。不确定允许删除,但空的解析器方法可以工作。
解析器的答案是:How do I initialize ActionDispatch::ParamsParser in Rails 3.1?
代码来自actionpack-3.2.8/lib/action_dispatch/middleware/params_parser.rb
https://stackoverflow.com/questions/10212434
复制相似问题