Analyse de la charge utile JSON dans les rails lors de l'utilisation d'un type MIME personnalisé

StackOverflow https://stackoverflow.com/questions/1214978

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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top