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(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型,是來設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動 使用指定應用程序來打開。
MIME早期是應用於電子郵件系統,後來也應用到了瀏覽器中。瀏覽器會根據MIME類型來打開不一樣的文件,如mp3文件。早期的HTTP協議中是沒有附加 數據類型信息,全部傳輸的數據都被解釋爲超文本標記語言(HTML文檔),當MIME被支持之後HTTP傳輸的不只是普通的文本,而是咱們如今看到的各類 個樣的數據形式了。html
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類型的。咱們上面講過,服務端是經過請求後綴來識別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
剛開始學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