Разбор полезной нагрузки JSON в Rails при использовании пользовательского типа MIME
-
06-07-2019 - |
Вопрос
Приложение 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. Если я установлю " Тип содержимого: " заголовок application / json, данные разбираются в хэш params.
Но если я установлю " Тип содержимого: " заголовок 'applcation / vnd.com.example.Foo + json', тогда полезная нагрузка не анализируется.
Похоже, что MIME :: Type.register используется для управления блоком response_to, но не для принятия решения о том, как анализировать полезные нагрузки для методов создания и обновления.
Есть идеи?
Решение
Для тех, кому это может быть интересно, я нашел ответ на свой вопрос.
Используйте что-то подобное в 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-тип во все строчные буквы, поэтому совпадений не будет найдено, если он установлен в верхний регистр.
Другие советы
В Rails 3 делаем:
ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body|
JSON.parse(body)
end
В Rails 5 делайте:
ActionDispatch::Request.parameter_parsers[Mime::Type.lookup('application/vnd.api+json').symbol] = lambda do |body|
JSON.parse(body)
end