如何防止ruby on Rails 3解析JSON POST?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

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

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

我如何禁用此功能?

提问于
用户回答回答于

我会说你最好的办法是用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方式传递它。

扫码关注云+社区