2009-07-31 7 views
4

Eine Rails-Anwendung mit einer RESTful-Schnittstelle muss POST-Daten mit einem benutzerdefinierten MIME-Typ basierend auf 'application/json' akzeptieren. Nennen wir diesen MIME-Typ 'application/vnd.com.example.Foo + json'. Die Registrierung des benutzerdefinierten MIME-Typs in Rails mit Mime :: Type.register funktioniert gut, da die Anwendung den MIME-Typ erkennt, der im Header "Accept:" angegeben ist, und eine JSON-Ansicht über respond_to rendert.Analysieren von JSON Payload in Rails bei Verwendung eines benutzerdefinierten MIME-Typs

Das Problem ist mit Controller-Methoden wie aktualisieren und erstellen, die benutzerdefinierte JSON-formatierte Daten in einen Params-Hash konvertieren müssen. Wenn ich den Header "Content Type:" auf application/json setze, werden die Daten in den Params-Hash geparst.

Aber wenn ich den Header "Content Type:" auf "applcation/vnd.com.example.Foo + json" setzen, dann wird die Nutzlast nicht geparst.

Es scheint also, als ob MIME :: Type.register für die Steuerung des Blocks "advant_to" verwendet wird, aber nicht für die Entscheidung, wie Nutzdaten für Erstellungs- und Aktualisierungsmethoden analysiert werden.

Irgendwelche Ideen?

Antwort

6

Für diejenigen, die interessiert sein könnten, fand ich die Antwort auf meine eigene Frage.

Verwendung so etwas wie dies in mime_types.rb (oder möglicherweise an anderer Stelle in Ihrer Initialisierungssequenz):

ActionController::Base.param_parsers[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body| 
    JSON.parse body 
end 

einen Haken: Kapitalisierung nicht oben (dh ‚Anwendung im MIME-Typ verwenden /vnd.com.example.Foo+json '). Rails konvertiert den MIME-Typ in Kleinbuchstaben, so dass keine Übereinstimmung gefunden wird, sondern Großbuchstaben.

+1

Sieht aus wie es ein wenig anders in Rails sein könnte 5: 'ActionDispatch :: Request.parameter_parsers [Mime: : Type.lookup ('application/vnd.com.example.foo + json')] = lambda {| raw_post | ActiveSupport :: JSON.de-Code (raw_post)} –

4

In Rails 3 tun:

ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body| 
    JSON.parse(body) 
end 
3

In Rails 5 tun:

ActionDispatch::Request.parameter_parsers[Mime::Type.lookup('application/vnd.api+json').symbol] = lambda do |body| 
    JSON.parse(body) 
end 
Verwandte Themen