Análise JSON Payload no Rails ao usar personalizado tipo MIME
-
06-07-2019 - |
Pergunta
Aplicação A Rails com uma interface RESTful precisa aceitar dados POST usando um tipo MIME personalizado com base em 'application / json'. Vamos chamada que tipo MIME 'application / vnd.com.example.Foo + json'.
Registrando o tipo MIME personalizado no Rails usando Mime :: Type.register funciona bem em que o aplicativo reconhece o tipo MIME dada em "Aceitar". Cabeçalho e processa uma vista JSON através respond_to
O problema é com métodos do controlador, como atualizar e criar essa necessidade de dados formatados convertido costume JSON em um hash params. Se eu definir o "Tipo de Conteúdo:". Cabeçalho para application / json, os dados são analisados ??para o hash de parâmetros
Mas se eu definir o "Tipo de Conteúdo:". Cabeçalho para 'applcation / vnd.com.example.Foo + json', então a carga útil não ter analisado
Assim, parece que MIME :: Type.register é utilizado para accionar o bloco respond_to, mas não para decidir como analisar cargas úteis para criar e métodos de atualização.
Todas as idéias?
Solução
Para aqueles que possam estar interessados, eu encontrei a resposta à minha pergunta.
Use algo como isso em mime_types.rb (ou possivelmente em outros lugares em sua sua seqüência de inicialização):
ActionController::Base.param_parsers[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body|
JSON.parse body
end
Um problema: não utilize maiúsculas no tipo MIME acima (isto é, 'aplicação / vnd.com.example.Foo + json'). Trilhos converte o tipo de MIME em todas as letras minúsculas, de forma que nenhum jogo será encontrado que ele é definido como maiúsculas.
Outras dicas
Em Rails 3 fazer:
ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body|
JSON.parse(body)
end
Em Rails 5 fazer:
ActionDispatch::Request.parameter_parsers[Mime::Type.lookup('application/vnd.api+json').symbol] = lambda do |body|
JSON.parse(body)
end