Rails中的MIME类型

layout title date comments categories
post rails的中的MIME类型 2014-09-08 21:40 true ruby

Rails开发中常常使用不一样的请求格式来处理不一样的响应,最多见的是同一个action对html/text和json格式的响应不一样的数据。 那么, Rails中有哪些响应格式已是怎么处理这些请求格式呢?本文详细讲讲rails中的处理方式。javascript

 

什么是MIME?

先看看MIME的标准定义。MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,是来设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动 使用指定应用程序来打开。
MIME早期是应用于电子邮件系统,后来也应用到了浏览器中。浏览器会根据MIME类型来打开不一样的文件,如mp3文件。早期的HTTP协议中是没有附加 数据类型信息,全部传输的数据都被解释为超文本标记语言(HTML文档),当MIME被支持之后HTTP传输的不只是普通的文本,而是咱们如今看到的各类 个样的数据形式了。html

MIME的定义和组成

MINE类型是由两部分组成,前面是数据的大类别,文本text、图象image等,后面定义具体的种类。例如:java

//大类别为text
 html文本   .html text/html
 xml文档    .xml  text/xml
 普通文本    .txt  text/plain

//大类别为application
 XHTML文档  .xhtml application/xhtml+xml
 pdf文档    .pdf application/pdf

//大类别为image
 png图像    .png image/png
 git图形    .gif image/gif

MIME其实是由一个专门的组织IANA来确认标准的MIME类型,可是因为互联网发展速度太快,由IANA来肯定标准远远跟不上应用程序的发展 速度。所以,如今多数采用事实标准,也就是由服务器和浏览器共同认可的MIME类型便可;一般web服务器(下面要介绍rails中的mime类型)和浏 览器都已默认设置了常见的mime类型,当确实须要使用一些不常见的mime类型时,能够在服务器和浏览器同时设置,以好让浏览器解析。
在服务器端,是经过请求的后缀名来识别不一样的mime类型的,所以服务器中必须定义有请求后缀与mime类型的对应关系(rails中是在 action_dispatch/http/mime_types.rb中定义)。 浏览器在接受响应数据时,接受的服务器的数据流,也就是说不会解析文件的名字,要让浏览器识别不一样的类型的文件数据就须要在响应数据中设置mime类型信 息。服务器在响应数据前,首先是要设置数据的MIME类型信息,这个是经过http信息头部的Content-type关键字进行设定的。git

//冒号以后必须一个空格
Content-type: text/html

Rails中的MIME类型

接下来,咱们看看Rails中是如何处理mime类型的。咱们上面讲过,服务端是经过请求后缀来识别mime类型的。Rails的请求后缀能够经过request.formart获得,具体看看format的处理细节:github

def formats
  @env["action_dispatch.request.formats"] ||=
    if parameters[:format]
      Array(Mime[parameters[:format]])
    elsif use_accept_header && valid_accept_header
      accepts
    elsif xhr?
      [Mime::JS]
    else
      [Mime::HTML]
    end
end

从上面代码能够看到,Rails首先会接受咱们本身设定的format参数,这个参数能够经过3中方式设置:
1. url后缀,如:users.json, users/1.json
2. 经过foramt参数传递,如:{id: 1, format: 'json' }
3. 路由中设置默认formart, 如:defaults: { format: :json } web

若是没有指定format参数rails会检查你请求头部,也就是accepts方法作的事情,其实也就是查看Content-type。
上面都没有找到mime类型而且为异步请求,就直接设置format为'js'类型(注意,不是json)。
最后都没有找到,就按普通html处理,也就是'text/html'。 ajax

前面已经提到过,服务器会维护一个format和mine类型的对应关系,rails中是由Mime::Type这里处理,调用 Mime::Type.register来注册新的mime类型,具体见action_dispatch/http/mime_types.rb文件。json

不要用json类型来判断是否为异步请求

刚开始学javascript时候,很容易犯的一个错误就是使用json请求后缀来判断是不是ajax请求,这个绝大多数是没有问题的,由于将 ajax请求设置为json后缀几乎是约定俗成了。实际上这样作的不靠谱的,上面的代码能够看出判断异步请求rails是用xhr?方法,这个方法是这样 作的:浏览器

def xml_http_request?
  @env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/i
end
alias :xhr? :xml_http_request?

很明显,用的http请求的'XMLHttpRequest'关键字来判断是不是异步,而非请求头部的Content-type。ruby

总结,本文讲述了MIME类型的定义,组成部分和做用,以及Rails中对MIME类的处理,但愿你们有所了解。

 

参考连接:https://github.com/nateyu/nateyu.github.com/blob/master/_posts/2014-09-08-railsde-zhong-de-mime-type.markdown

相关文章
相关标签/搜索