我即将为一些同事主持关于REST的培训研讨会,我想验证有关Rails路由的一些内容。
我们的应用程序以当前形式允许客户以三种不同的方式指定格式:
1
/path/to/resource.json
2
/path/to/resource?format=json
3
接受请求的标头
我的问题与前两个选项有关:这些规范的作用是否存在任何内在差异?具体来说,它们是否只设置Accept标头或Content-Type标头?
答案 0 :(得分:0)
这是他们查找要设置的标头内容类型的方式。
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)
嗯,1
和2
并不完全不同,因为Rails通常会生成以下路由:
/something(.:format)
这意味着" 可选参数format
用点"分隔。但是,参数也可以在查询字符串中指定,该字符串不是路径的一部分。
因此,查询JSON的第二种方式将使路由系统认为format
根本不在路由中。但是,当涉及到控制器时,Rails已经解析了该查询字符串,并且会在需要响应时找到该格式。
也就是说,如果你在任何地方都没有指定/path/to/resource
的情况下点击format
,那么你会得到与2
相同的结果:你选择了一条路线,假设那里有Content-Type
没有给出格式。不过,Rails会解析标题并确定它应该响应的格式。
至于客户需要设置的内容:accept header only,Content-Type
仅在用户自己发送实体时才有意义,并且它只与#34相关; Rails应该如何解析传入的参数",它与响应无关。当然,默认情况下,Rails会尽力将{{1}}的响应设置为合理的。