首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >阻止ruby on rails 3解析JSON post

阻止ruby on rails 3解析JSON post
EN

Stack Overflow用户
提问于 2012-04-18 23:14:38
回答 2查看 2.7K关注 0票数 18

我在Ruby on Rails 3中有一个控制器方法,它接受application/JSON作为内容类型。这一切都符合预期,但我实际上不希望rails自动解析POST请求正文中的JSON。此方法充当网关,只是将信息穿梭到队列中,并且可能相当大。我不想浪费时间将数据处理到@_params中,因为这是不必要的。

我相信我可以通过将请求头部中的content-type设置为其他值来解决这个问题,但我希望对HTTP请求的语义是正确的。

如何禁用此功能?

编辑:更具体地说,我如何仅为这一条路由编辑此功能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-03 23:40:28

参数解析在actionpack的lib/action_dispatch/middleware/params_parser.rb中进行得非常深入。

我会说,你最好的办法就是用Rack截取请求,就像这样。

lib/raw_json.rb

代码语言:javascript
复制
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之前插入以下内容

代码语言:javascript
复制
require 'raw_json'
use Rack::RawJSON
票数 13
EN

Stack Overflow用户

发布于 2012-09-28 18:52:07

它可能是内置的,但请看一下代码:

代码语言:javascript
复制
 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10212434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档