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

相關文章
相關標籤/搜索