2015-03-02 12 views
5

Erstens:Grape: Rettung von ungültiger JSON

ich Traube bin mit meiner API für den Bau (Rails 4). Wenn jemand einen ungültigen JSON Körper sendet (z die letzte } vergessen haben), wird der folgende Fehler ausgelöst:

ActionDispatch::ParamsParser::ParseError (795: unexpected token at '{"foobar": 1234 

') 

Ich versuchte es mit Trauben rescue_from :all Option, aber das funktioniert nicht. Im Inneren des Stacktrace sehe ich den Traubenstein nicht. Es scheint, dass dieser Fehler von Action geworfen wird:

.gems/gems/actionpack-4.1.4/lib/action_dispatch/middleware/params_parser.rb:53:in `rescue in parse_formatted_parameters' 
    .gems/gems/actionpack-4.1.4/lib/action_dispatch/middleware/params_parser.rb:32:in `parse_formatted_parameters' 
    .gems/gems/actionpack-4.1.4/lib/action_dispatch/middleware/params_parser.rb:23:in `call' 

Aber was wäre der beste Weg, um die Fehler, Rückkehr einen 400: Bad Request Fehler abzufangen, und schließt die unexpected token at '{"foobar": 1234 Mitteilung innerhalb der json Antwort?

Zweitens:

Ich versuchte dies mit RSpec zu testen, aber hatte kein Glück eine rohe Anforderung mit einer ungültigen JSON auf Senden. Ich versuchte es mit

, aber dies wirft nicht den Fehler von oben. Ich dachte seit Rails 4, der zweite Parameter, der als String übergeben wird, wird wie der rohe Körper behandelt?

+0

Ich glaube, Sie sollten prüfen, zu trennen, diese Frage in zwei Fragen ... –

Antwort

4

Leider läuft ActionDispatch weit voraus, es jemals zu einem Controller zu bekommen, so dass Sie dies nicht mit Grape (AFAIK) tun können.

Wir sind auch auf dieses Problem gestoßen und haben eine wonderful article von den Thoughtbot-Jungs zu dem Thema gefunden.

den Curb gem Verwenden Sie die shotty Anrufe vor:

require 'curb' 
it 'sends poorly formatted json' do 
    broken_json = %Q|{"notice":{"title":"A sweet title"#{invalid_tokens}}}| 
    resp = Curl.post("http://#{host}:#{port}#{path}", broken_json) 

    expect(resp.response_code).to eq 500 
end 

Thoughtbot empfiehlt das Schreiben einer Middleware-Klasse zu erfassen Zukunft JSON analysieren Fehler wie folgt aus:

# in app/middleware/catch_json_parse_errors.rb 
class CatchJsonParseErrors 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    begin 
     @app.call(env) 
    rescue ActionDispatch::ParamsParser::ParseError => error 
     if env['HTTP_ACCEPT'] =~ /application\/json/ 
     error_output = "There was a problem in the JSON you submitted: #{error}" 
     return [ 
      400, { "Content-Type" => "application/json" }, 
      [ { status: 400, error: error_output }.to_json ] 
     ] 
     else 
     raise error 
     end 
    end 
    end 
end 
+0

Danke, ich werde es versuchen! Noch eine Frage: Ich habe Capybara nicht laufen lassen, sondern nur rspec 'type:: request'. Wie kann ich den aktuellen Host (sollte localhost sein) und den Port herausfinden? – 23tux

+0

Ich würde nur eine Konstante in Ihrem 'spec_helper' für Host (gleich localhost) setzen. – Anthony

+0

Ok, der Host ist klar, aber was ist mit dem Port? Gibt es eine Möglichkeit herauszufinden, an welchem ​​Port rspec rails läuft? – 23tux

Verwandte Themen