ruby-on-rails - 使用自定义 MIME 类型时在 Rails 中解析 JSON 有效负载

标签 ruby-on-rails json rest mime-types

具有 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/

相关文章:

C# Swagger 生成的客户端如何验证和使用自动生成的代码

java - 构建一个测试,该测试使用在本地主机上运行的基于 Spring 的 REST API URL 进行测试

ruby-on-rails - Ruby 单引号与双引号

html - 音频中的内容与报道的内容不符 - 回形针

sql - PostgreSQL:根据特定列将多行聚合为 JSON 数组

JSON:在创建带有 pretty-print 的文件时死于解码

java - 如何限制 tomcat/java Web 服务器世界中每个路由的最大线程

ruby-on-rails - 不使用 Outlook 发送实际的 Outlook session 请求

mysql - Rails MySQL 查询单表继承 N+1 问题

javascript - 如何使用ajax正确地将json发送到RestController?