18

Ruby on Rails 3には、コンテンツタイプとしてapplication/JSONを受け入れるコントローラーメソッドがあります。これはすべて期待どおりに機能しますが、実際には、RailsがPOSTリクエストの本文のJSONを自動的に解析することは望んでいません。このメソッドはゲートウェイとして機能し、情報をキューにシャトルするだけで、非常に大きくなる可能性があります。@_paramsへのデータの処理は不要なので、時間を無駄にしたくありません。

リクエストのヘッダーにあるcontent-typeを別のものに設定することでこれを回避できると思いますが、HTTPリクエストに対して意味的に正しいものにしたいと思います。

この機能を無効にするにはどうすればよいですか?

編集:より具体的には、この1つのルートだけでこの機能を編集するにはどうすればよいですか?

4

3 に答える 3

13

パラメータの解析は、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-05-03T15:40:27.867 に答える
1

それは焼き付けられているかもしれませんが、コードを見てください:

 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]

したがって、この初期化子にハッシュを送信するように調整できる場合は、デフォルトを追加またはオーバーライドできます。削除できるかどうかはわかりませんが、空のパーサーメソッドが機能する可能性があります。

パーサーはここで答えます:Rails3.1でActionDispatch:: ParamsParserを初期化するにはどうすればよいですか?

コードはactionpack-3.2.8/lib/action_dispatch/middleware/params_parser.rbからのものです

于 2012-09-28T10:52:07.003 に答える
1

単一のリクエストからJSONを解析するためのオーバーヘッドは比較的低くなります。JSONの処理が全体的な処理の速度低下の原因になっていると考える特別な理由がありますか?

そうでない場合は、問題として特定できるようになるまで、これをそのままにしておくことをお勧めします。

そのJSONを解析しないようにRailsを構成すると(ある種のラック構成または他の方法で)、標準のRailsWayで処理されないルートがアプリケーションに少なくとも1つ作成されます。

最終的には、このデータの何らかの処理を行う必要があることに気付くかもしれません。または、その前に何らかのセキュリティを設定する必要があるかもしれません。または、ログに記録して、送信したユーザーに関連付けたい場合もあります。そして、その日が来ると、あなた(またはあなたのチームの他の誰か)が入って、この非標準の実装に変更を加える必要があります。

Railsの実装で非標準的な方法で物事を行うと、ソフトウェアの保守が複雑になり、時間がかかる可能性があります。人々は非標準的な処理にあまり慣れていないため、これは欠陥の一般的な原因でもあります。

したがって、それが実際の問題でない限り、RailsにJSONを処理させてから、通常のRailsWayに渡すことをお勧めします。

于 2012-05-08T13:27:15.800 に答える