具有 RESTful 接口(interface)的 Rails 应用程序需要使用基于 'application/json' 的自定义 MIME 类型来接受 POST 数据。我们称该 MIME 类型为“application/vnd.com.example.Foo+json”。
使用 Mime::Type.register 在 Rails 中注册自定义 MIME 类型可以正常工作,因为应用程序可以识别“Accept:” header 中给出的 MIME 类型并通过 response_to 呈现 JSON View 。
问题在于 Controller 方法(例如更新和创建)需要将自定义 JSON 格式的数据转换为参数哈希。如果我将“内容类型:” header 设置为 application/json,则数据将被解析为 params 哈希。
但是,如果我将“内容类型:” header 设置为“applcation/vnd.com.example.Foo+json”,则不会解析有效负载。
因此,似乎 MIME::Type.register 用于驱动 respond_to block ,而不是决定如何解析有效载荷以用于创建和更新方法。
有任何想法吗?
最佳答案
这是我在 Rails 5 中学习到的:
Rich 的信息是一个很好的起点,和他一样,我在初始化程序中添加了我的代码(在 config/initializers/mime_types.rb
中)。
在我的场景中,当使用可以解析为常规 json 的自定义内容类型时,很容易将另一个同义词添加到 json mime 类型,如下所示:
json_mime_type_synonyms = %w[
text/x-json
application/jsonrequest
application/foobar+json
]
Mime::Type.register('application/json', :json, json_mime_type_synonyms)
如果您采用这种方法,请确保包含其他同义词(它们来自默认的 json mime 类型)以确保它们继续正常工作。
或者,如果您需要自定义解析逻辑或更喜欢单独的 mime 类型,以下是注册 mime 类型及其相关参数解析器的方法:
Mime::Type.register('application/foobar+json', :foobar_json)
ActionDispatch::Request.parameter_parsers[:foobar_json] = -> (body) {
JSON.parse(body)
}
关于ruby-on-rails - 使用自定义 MIME 类型时在 Rails 中解析 JSON 有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1214978/