Разбор полезной нагрузки JSON в Rails при использовании пользовательского типа MIME - PullRequest
5 голосов
/ 01 августа 2009

Приложение Rails с интерфейсом RESTful должно принимать данные POST, используя пользовательский тип MIME, основанный на 'application / json'. Давайте назовем этот MIME-тип «application / vnd.com.example.Foo + json».

Регистрация пользовательского типа MIME в Rails с использованием Mime :: Type.register работает нормально, поскольку приложение распознает тип MIME, указанный в заголовке «Accept:», и отображает представление JSON через response_to.

Проблема заключается в методах контроллера, таких как update и create, которые должны преобразовывать пользовательские данные в формате JSON в хэш params. Если я установлю заголовок «Content Type:» для application / json, данные будут проанализированы в хэш params.

Но если я установлю заголовок «Content Type:» в applcation / vnd.com.example.Foo + json, то полезная нагрузка не будет проанализирована.

Похоже, MIME :: Type.register используется для управления блоком response_to, но не для принятия решения о том, как анализировать полезные нагрузки для методов создания и обновления.

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 01 августа 2009

Для тех, кому это может быть интересно, я нашел ответ на свой вопрос.

Используйте что-то вроде этого в mime_types.rb (или, возможно, в другом месте вашей последовательности инициализации):

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

Одна загвоздка: не используйте заглавные буквы в указанном выше типе MIME (то есть 'application / vnd.com.example.Foo + json'). Rails преобразует тип MIME во все строчные буквы, поэтому совпадений не будет найдено, если он установлен в верхний регистр.

4 голосов
/ 07 июля 2016

В Rails 5 do:

ActionDispatch::Request.parameter_parsers[Mime::Type.lookup('application/vnd.api+json').symbol] = lambda do |body|
  JSON.parse(body)
end
4 голосов
/ 05 января 2012

В Rails 3 do:

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