Разбор полезной нагрузки JSON в Rails при использовании пользовательского типа MIME

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

Вопрос

Приложение 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top