繁体   English   中英

防止rails 3上的ruby解析JSON帖子

[英]Prevent ruby on rails 3 from parsing JSON post

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

我相信我可以通过将请求标头中的内容类型设置为其他内容来解决这个问题,但我希望对于HTTP请求在语义上是正确的。

如何禁用此功能?

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

参数解析在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

从单个请求解析JSON的开销相对较低。 您是否有特别的理由相信处理JSON会导致整体处理的任何缓慢?

如果没有,那么我建议您保留原样,直到可以将其识别为问题为止。

配置rails不解析该JSON(通过某种机架配置或某些其他方法)将在应用程序中创建至少一条未以标准Rails方式处理的路由。

最终,您可能会发现自己必须对此数据进行某种处理。 或者你可能需要在它面前放置某种安全性。 或者您可能想要记录它并将其与发送它的用户相关联。 当那一天到来时(或团队中的其他人)将需要进入并对此非标准实施进行更改。

在Rails实现中以非标准方式执行操作会增加维护软件的复杂性和时间。 它也是缺陷的常见来源,因为人们不熟悉非标准处理。

因此,除非它是一个真正的问题,我建议让rails处理JSON,然后简单地通过正常的Rails方式传递它。

它可能会被烘焙,但看看代码:

 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]

因此,如果您可以安排向此初始值设定项发送哈希值,则可以添加或覆盖默认值。 不确定允许删除,但空解析器方法可以工作。

解析器在这里回答: 如何在Rails 3.1中初始化ActionDispatch :: ParamsParser?

代码来自actionpack-3.2.8 / lib / action_dispatch / middleware / params_parser.rb

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM