2009-07-31 7 views
4

Une application Rails avec une interface RESTful doit accepter les données POST à ​​l'aide d'un type MIME personnalisé basé sur 'application/json'. Appelons ce type MIME 'application/vnd.com.example.Foo + json'.Analyse de la charge utile JSON dans les rails lors de l'utilisation du type MIME personnalisé

L'enregistrement du type MIME personnalisé dans Rails à l'aide de Mime :: Type.register fonctionne correctement car l'application reconnaît le type MIME donné dans l'en-tête "Accept:" et affiche une vue JSON via respond_to.

Le problème concerne les méthodes de contrôleur telles que la mise à jour et la création qui doivent convertir des données au format JSON personnalisées en un hachage param. Si je mets l'en-tête "Content Type:" à application/json, les données sont analysées dans le hash params. Mais si je définis l'en-tête "Content Type:" sur "applcation/vnd.com.example.Foo + json", la charge utile ne sera pas analysée. Il semble donc que MIME :: Type.register est utilisé pour piloter le bloc respond_to, mais pas pour décider comment analyser les charges utiles pour les méthodes create et update.

Des idées?

Répondre

6

Pour ceux qui pourraient être intéressés, j'ai trouvé la réponse à ma propre question.

Utilisez quelque chose comme ça dans mime_types.rb (ou peut-être ailleurs dans votre votre séquence d'initialisation):

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

Un hic: utilisez les majuscules dans le type MIME ci-dessus (« demande /vnd.com.example.Foo+json '). Rails convertit le type MIME en minuscules, donc aucune correspondance ne sera trouvée, elle est en majuscule.

+1

On dirait que ce serait peut-être un peu différent dans Rails 5: 'ActionDispatch :: Request.parameter_parsers [Mime: : Type.lookup ('application/vnd.com.example.foo + json')] = lambda {| raw_post | ActiveSupport :: JSON.decode (raw_post)} ' –

4

Rails 3 font:

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

Rails 5 font:

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