使用自定义MIME类型在Rails中解析JSON有效负载

问题描述:

具有RESTful接口的Rails应用程序需要使用基于'application/json'的自定义MIME类型来接受POST数据。我们称之为MIME类型'application/vnd.com.example.Foo + json'。使用自定义MIME类型在Rails中解析JSON有效负载

使用Mime :: Type.register在Rails中注册自定义MIME类型的工作很好,因为该应用程序识别“Accept:”头中给出的MIME类型,并通过respond_to呈现JSON视图。

问题是控制器方法,如更新和创建,需要将自定义JSON格式的数据转换为params散列。如果我将“Content Type:”标头设置为application/json,则数据将被解析为params散列。

但是,如果我将“Content Type:”标头设置为'applcation/vnd.com.example.Foo + json',那么负载不会被解析。

所以它看起来像MIME :: Type.register用于驱动respond_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类型以上(即“应用程序中使用大写/vnd.com.example.Foo+json')。 Rails将MIME类型转换为全部小写字母,因此不会找到匹配,因此将其设置为大写。

+1

看起来似乎是用Rails 5有一点不同: `ActionDispatch :: Request.parameter_parsers [MIME类型: :Type.lookup('application/vnd.com.example.foo + json')] = lambda {| raw_post | ActiveSupport :: JSON.decode(raw_post)}` – 2016-03-05 16:10:56

在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