Rails格式说明符差异

时间:2014-11-24 14:50:33

标签: ruby-on-rails http http-headers

我即将为一些同事主持关于REST的培训研讨会,我想验证有关Rails路由的一些内容。

我们的应用程序以当前形式允许客户以三种不同的方式指定格式:

1

/path/to/resource.json

2

/path/to/resource?format=json

3

接受请求的标头

我的问题与前两个选项有关:这些规范的作用是否存在任何内在差异?具体来说,它们是否只设置Accept标头或Content-Type标头?

2 个答案:

答案 0 :(得分:0)

请检查以下初始化程序: https://github.com/rails/rails/blob/756baf296b3cb3f7bc40d5843e259276695071ab/actionpack/lib/action_dispatch/http/response.rb#L113

这是他们查找要设置的标头内容类型的方式。

if content_type = self[CONTENT_TYPE]
 type, charset = content_type.split(/;\s*charset=/)
 @content_type = Mime::Type.lookup(type)
 @charset = charset || self.class.default_charset
end

所以你甚至可以以编程方式将content_type设置为header,或params或asformat

答案 1 :(得分:0)

嗯,12并不完全不同,因为Rails通常会生成以下路由:

/something(.:format)

这意味着" 可选参数format用点"分隔。但是,参数也可以在查询字符串中指定,该字符串不是路径的一部分

因此,查询JSON的第二种方式将使路由系统认为format根本不在路由中。但是,当涉及到控制器时,Rails已经解析了该查询字符串,并且会在需要响应时找到该格式。

也就是说,如果你在任何地方都没有指定/path/to/resource的情况下点击format,那么你会得到与2相同的结果:你选择了一条路线,假设那里有Content-Type没有给出格式。不过,Rails会解析标题并确定它应该响应的格式。

至于客户需要设置的内容:accept header onlyContent-Type仅在用户自己发送实体时才有意义,并且它只与#34相关; Rails应该如何解析传入的参数",它与响应无关。当然,默认情况下,Rails会尽力将{{1}}的响应设置为合理的。