3

Rails 3.2.11アプリケーション(MRI 1.9.3)に取り組んでいます。
PArt of itは、JSONシリアル化された本文でPOSTリクエストを受信するWebサービスです。
すべてが機能しますが、無効なJSONなどの不適切な形式のリクエストに対して回復力を持たせたいと思います。

現在、コンマが欠落しているJSONを受信すると、デフォルトのRailsエラービュー(および開発中の場合はバックトレース)を含むHTML応答で500エラーが返されます。
エラーに関する情報を含むJSONまたはXML応答を返すようにカスタマイズしたいと思います。

エラーは、ApplicationControllerでMultiJson::DecodeError例外をトラップできることを知ってrescue_fromいますが、機能していないようです。
これは、エラーが通常のリクエストフローの範囲外で発生した場合と同じです。

これは私のコードです(動作するようになったら、エラーメッセージをより多くのデータで展開します):

class ApplicationController < ActionController::Base
  #protect_from_forgery
  rescue_from MultiJson::DecodeError do |exception|
    @response = { :error => "the request body was not acceptable" }
    respond_to do |format|
        format.html { redirect_to :root, notice: "invalid params" }
        format.xml { render :xml => @response, status: 400 }
        format.json { render :json => @response, status: 400 }
    end
  end
end

そして、これはバックトレースです。

MultiJson::DecodeError (795: unexpected token at '{
    "json_with_missing_comma" : {
        "foo" : "qqqqqqqqqqqqqqq"
        "bar" : "aaaaaaaaaaaaaa"
    }}'):
  json (1.7.6) lib/json/common.rb:155:in `parse'
  json (1.7.6) lib/json/common.rb:155:in `parse'
  multi_json (1.5.0) lib/multi_json/adapters/json_common.rb:7:in `load'
  multi_json (1.5.0) lib/multi_json.rb:96:in `load'
  activesupport (3.2.11) lib/active_support/json/decoding.rb:15:in `decode'
  actionpack (3.2.11) lib/action_dispatch/middleware/params_parser.rb:47:in `parse_formatted_parameters'
  actionpack (3.2.11) lib/action_dispatch/middleware/params_parser.rb:17:in `call'
  actionpack (3.2.11) lib/action_dispatch/middleware/flash.rb:242:in `call'
  rack (1.4.4) lib/rack/session/abstract/id.rb:210:in `context'
  rack (1.4.4) lib/rack/session/abstract/id.rb:205:in `call'
  actionpack (3.2.11) lib/action_dispatch/middleware/cookies.rb:341:in `call'
  activerecord (3.2.11) lib/active_record/query_cache.rb:64:in `call'
  activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_pool.rb:479:in `call'
  actionpack (3.2.11) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
  activesupport (3.2.11) lib/active_support/callbacks.rb:405:in `_run__1562301902235545482__call__1964551201027599208__callbacks'
  activesupport (3.2.11) lib/active_support/callbacks.rb:405:in `__run_callback'
  activesupport (3.2.11) lib/active_support/callbacks.rb:385:in `_run_call_callbacks'
  activesupport (3.2.11) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (3.2.11) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (3.2.11) lib/action_dispatch/middleware/reloader.rb:65:in `call'
  actionpack (3.2.11) lib/action_dispatch/middleware/remote_ip.rb:31:in `call'
  actionpack (3.2.11) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call'
  actionpack (3.2.11) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.11) lib/rails/rack/logger.rb:32:in `call_app'
  railties (3.2.11) lib/rails/rack/logger.rb:16:in `block in call'
  activesupport (3.2.11) lib/active_support/tagged_logging.rb:22:in `tagged'
  railties (3.2.11) lib/rails/rack/logger.rb:16:in `call'
  actionpack (3.2.11) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.4) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.4) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.11) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.4) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.11) lib/action_dispatch/middleware/static.rb:62:in `call'
  railties (3.2.11) lib/rails/engine.rb:479:in `call'
  railties (3.2.11) lib/rails/application.rb:223:in `call'
  rack (1.4.4) lib/rack/content_length.rb:14:in `call'
  railties (3.2.11) lib/rails/rack/log_tailer.rb:17:in `call'
  thin (1.5.0) lib/thin/connection.rb:81:in `block in pre_process'
  thin (1.5.0) lib/thin/connection.rb:79:in `catch'
  thin (1.5.0) lib/thin/connection.rb:79:in `pre_process'
  thin (1.5.0) lib/thin/connection.rb:54:in `process'
  thin (1.5.0) lib/thin/connection.rb:39:in `receive_data'
  eventmachine (1.0.0) lib/eventmachine.rb:187:in `run_machine'
  eventmachine (1.0.0) lib/eventmachine.rb:187:in `run'
  thin (1.5.0) lib/thin/backends/base.rb:63:in `start'
  thin (1.5.0) lib/thin/server.rb:159:in `start'
  rack (1.4.4) lib/rack/handler/thin.rb:13:in `run'
  rack (1.4.4) lib/rack/server.rb:268:in `start'
  railties (3.2.11) lib/rails/commands/server.rb:70:in `start'
  railties (3.2.11) lib/rails/commands.rb:55:in `block in <top (required)>'
  railties (3.2.11) lib/rails/commands.rb:50:in `tap'
  railties (3.2.11) lib/rails/commands.rb:50:in `<top (required)>'
  script/rails:6:in `require'
  script/rails:6:in `<main>'
4

1 に答える 1

2

宝石: https://github.com/kares/request_exception_handlerと以下の行が私にとってはうまくいきます。

アプリケーションコントローラーで: " rescue_from 'REXML::ParseException' do |exception| render :text => "Bad Request: XML parse exception", :status => 422 end

Rescue_from 'MultiJson::DecodeError' do |例外| render :text => "Bad Request: JSON parse exception", :status => 422 end "

于 2013-02-07T21:59:08.383 に答える