-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path14914440715103.html
More file actions
195 lines (158 loc) · 9.5 KB
/
14914440715103.html
File metadata and controls
195 lines (158 loc) · 9.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
<!DOCTYPE html>
<!--[if lt IE 7 ]><html class="ie ie6" lang="en"> <![endif]-->
<!--[if IE 7 ]><html class="ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!-->
<html lang="en">
<!--<![endif]-->
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>
rails的中的MIME类型 - 余瓞归的博客
</title>
<meta name="description" content="ruby, rails, html, css, linux,javascript">
<link href="atom.xml" rel="alternate" title="余瓞归的博客" type="application/atom+xml">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:600,800" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="asset/image/favicon.png">
<link rel="stylesheet" href="asset/css/base.css">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha256-k2/8zcNbxVIh5mnQ52A0r3a6jAgMGxFJFE2707UxGCk= sha512-ZV9KawG2Legkwp3nAlxLIVFudTauWuBpC10uEafMHYL0Sarrz5A7G79kXh5+5+woxQ5HM559XX2UZjMJ36Wplg==" crossorigin="anonymous">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.10.0/styles/default.min.css">
</head>
<body>
<div class="container">
<div class="eleven columns content">
<p class="meta nav-header">
<a href="./archives.html">文章分类</a>
> <a class='category' href='ruby.html'>ruby</a>
<a href="./">
<i class="home fa fa-home"></i>
</a>
</p>
<h1 class="title">rails的中的MIME类型</h1>
<div class="meta">
<div class="date">
发表于:<time datetime="2014/9/8">2014/9/8</time>
</div>
</div>
<div id="post">
<p>Rails开发中经常使用不同的请求格式来处理不同的响应,最常见的是同一个action对html/text和json格式的响应不同的数据。 那么, Rails中有哪些响应格式已经是怎么处理这些请求格式呢?本文详细讲讲rails中的处理方式。</p>
<span id="more"></span><!-- more -->
<h3 id="toc_0">什么是MIME?</h3>
<p>先看看MIME的标准定义。MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,是来设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。<br/><br/>
MIME早期是应用于电子邮件系统,后来也应用到了浏览器中。浏览器会根据MIME类型来打开不同的文件,如mp3文件。早期的HTTP协议中是没有附加数据类型信息,所有传输的数据都被解释为超文本标记语言(HTML文档),当MIME被支持以后HTTP传输的不仅是普通的文本,而是我们现在看到的各种个样的数据形式了。</p>
<h3 id="toc_1">MIME的定义和组成</h3>
<p>MINE类型是由两部分组成,前面是数据的大类别,文本text、图象image等,后面定义具体的种类。例如:</p>
<pre><code>//大类别为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
</code></pre>
<p>MIME实际上是由一个专门的组织IANA来确认标准的MIME类型,但是由于互联网发展速度太快,由IANA来确定标准远远跟不上应用程序的发展速度。因此,现在多数采用事实标准,也就是由服务器和浏览器共同承认的MIME类型即可;通常web服务器(下面要介绍rails中的mime类型)和浏览器都已默认设置了常见的mime类型,当确实需要使用一些不常见的mime类型时,可以在服务器和浏览器同时设置,以好让浏览器解析。<br/><br/>
在服务器端,是通过请求的后缀名来识别不同的mime类型的,因此服务器中必须定义有请求后缀与mime类型的对应关系(rails中是在action_dispatch/http/mime_types.rb中定义)。<br/>
浏览器在接受响应数据时,接受的服务器的数据流,也就是说不会解析文件的名字,要让浏览器识别不同的类型的文件数据就需要在响应数据中设置mime类型信息。服务器在响应数据前,首先是要设置数据的MIME类型信息,这个是通过http信息头部的Content-type关键字进行设定的。</p>
<pre><code>//冒号之后必须一个空格
Content-type: text/html
</code></pre>
<h3 id="toc_2">Rails中的MIME类型</h3>
<p>接下来,我们看看Rails中是如何处理mime类型的。我们上面讲过,服务端是通过请求后缀来识别mime类型的。Rails的请求后缀可以通过request.formart得到,具体看看format的处理细节:</p>
<pre><code>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
</code></pre>
<p>从上面代码可以看到,Rails首先会接受我们自己设定的format参数,这个参数可以通过3中方式设置:<br/><br/>
1. url后缀,如:users.json, users/1.json<br/><br/>
2. 通过foramt参数传递,如:{id: 1, format: 'json' }<br/><br/>
3. 路由中设置默认formart, 如:defaults: { format: :json } </p>
<p>如果没有指定format参数rails会检查你请求头部,也就是accepts方法做的事情,其实也就是查看Content-type。<br/><br/>
上面都没有找到mime类型并且为异步请求,就直接设置format为'js'类型(注意,不是json)。<br/><br/>
最后都没有找到,就按普通html处理,也就是'text/html'。 </p>
<p>前面已经提到过,服务器会维护一个format和mine类型的对应关系,rails中是由Mime::Type这里处理,调用Mime::Type.register来注册新的mime类型,具体见action_dispatch/http/mime_types.rb文件。</p>
<h3 id="toc_3">不要用json类型来判断是否为异步请求</h3>
<p>刚开始学javascript时候,很容易犯的一个错误就是使用json请求后缀来判断是否是ajax请求,这个绝大多数是没有问题的,因为将ajax请求设置为json后缀几乎是约定俗成了。实际上这样做的不靠谱的,上面的代码可以看出判断异步请求rails是用xhr?方法,这个方法是这样做的:</p>
<pre><code>def xml_http_request?
@env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/i
end
alias :xhr? :xml_http_request?
</code></pre>
<p>很明显,用的http请求的'XMLHttpRequest'关键字来判断是否是异步,而非请求头部的Content-type。</p>
<p>总结,本文讲述了MIME类型的定义,组成部分和作用,以及Rails中对MIME类的处理,希望大家有所了解。</p>
</div>
<div id="post-pagination" class="pagination">
<p class="previous">
<a href="14914440431935.html" title="Previous Post: Swift中的闭包">上一页</a>
</p>
<p class="next">
<a href="14914441437461.html" title="Next Post: Redis主键失效原理">下一页</a>
</p>
</div>
</div>
<div class="four columns sidebar">
<nav>
<a href="./">
<img src="asset/image/logo.png" id="logo" alt="Blog logo" width="80" />
</a>
<h2>
<a href="./living.html">生活</a>
<a href="./technology.html">技术</a>
</h2>
<div id="bio">
<p style="text-align:center">欢迎访问我的个人博客.</p>
<p>
我是余瓞归,一个懒惰挑剔的Ruby程序员。现居上海浦东,在一家电子商务公司从事系统架构工作。
</p>
</div>
<div id="social">
Follow me:
<div id="stalker">
<a title="nateyu on Github" href="https://github.com/nateyu">
<i class="fa fa-github-square"></i>
</a>
<a title="Atom feed" id="atom" href="./atom.xml">
<i class="fa fa-rss-square"></i>
</a>
<a title="Email" id="email" href="mailto: yudiegui@gmail.com">
<i class="fa fa-envelope"></i>
</a>
</div>
</div>
</nav>
</div> <div class="footer">
<div class="disclaimer">
<p>
本网站文章为个人所有,未经作者认许请勿转载
</p>
<p>
© 余瓞归, 2017 — built with <a href="http://jekyllrb.com/">Jekyll</a> using <a href="https://github.com/swanson/lagom">Lagom theme</a>
</p>
</div>
</div>
</div>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.10.0/highlight.min.js"></script>
<script type="text/javascript">hljs.initHighlightingOnLoad();</script>
<script type="text/javascript">
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?01179477135d9e37e18df55d2011d072";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</body>
</html>