Analyse de la charge utile JSON dans les rails lors de l'utilisation d'un type MIME personnalisé
-
06-07-2019 - |
Question
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'.
L'enregistrement du type MIME personnalisé dans Rails à l'aide de Mime :: Type.register fonctionne correctement, car l'application reconnaît le type MIME indiqué dans la section "Accepter:". en-tête et restitue une vue JSON via respond_to.
Le problème concerne les méthodes du contrôleur, telles que la mise à jour et la création, qui nécessitent la conversion de données au format JSON personnalisées en un hachage params. Si je définis le & type; Type de contenu: " en-tête vers application / json, les données sont analysées dans le hachage params.
Mais si je définis le "Type de contenu:" en-tête "applcation / vnd.com.example.Foo + json", la charge utile ne sera pas analysée.
Il semble donc que MIME :: Type.register soit 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?
La solution
Pour ceux qui pourraient être intéressés, j'ai trouvé la réponse à ma propre question.
Utilisez quelque chose comme ceci dans mime_types.rb (ou éventuellement ailleurs dans 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 problème: n'utilisez pas la capitalisation dans le type MIME ci-dessus (c'est-à-dire 'application / vnd.com.example.Foo + json'). Rails convertit le type MIME en minuscule, donc aucune correspondance ne sera trouvée s'il est mis en majuscule.
Autres conseils
Dans Rails 3, faites:
ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body|
JSON.parse(body)
end
Dans Rails 5, faites:
ActionDispatch::Request.parameter_parsers[Mime::Type.lookup('application/vnd.api+json').symbol] = lambda do |body|
JSON.parse(body)
end