Rails中的MIME类型
| layout | title | date | comments | categories |
|---|---|---|---|---|
| post | rails的中的MIME类型 | 2014-09-08 21:40 | true | ruby |
Rails开发中经常使用不同的请求格式来处理不同的响应,最常见的是同一个action对html/text和json格式的响应不同的数据。 那么, Rails中有哪些响应格式已经是怎么处理这些请求格式呢?本文详细讲讲rails中的处理方式。
什么是MIME?
先看看MIME的标准定义。MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,是来设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动 使用指定应用程序来打开。
MIME早期是应用于电子邮件系统,后来也应用到了浏览器中。浏览器会根据MIME类型来打开不同的文件,如mp3文件。早期的HTTP协议中是没有附加
数据类型信息,所有传输的数据都被解释为超文本标记语言(HTML文档),当MIME被支持以后HTTP传输的不仅是普通的文本,而是我们现在看到的各种
个样的数据形式了。
MIME的定义和组成
MINE类型是由两部分组成,前面是数据的大类别,文本text、图象image等,后面定义具体的种类。例如:
//大类别为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关键字进行设定的。
//冒号之后必须一个空格
Content-type: text/html
Rails中的MIME类型
接下来,我们看看Rails中是如何处理mime类型的。我们上面讲过,服务端是通过请求后缀来识别mime类型的。Rails的请求后缀可以通过request.formart得到,具体看看format的处理细节:
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 }
如果没有指定format参数rails会检查你请求头部,也就是accepts方法做的事情,其实也就是查看Content-type。
上面都没有找到mime类型并且为异步请求,就直接设置format为'js'类型(注意,不是json)。
最后都没有找到,就按普通html处理,也就是'text/html'。
前面已经提到过,服务器会维护一个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。
总结,本文讲述了MIME类型的定义,组成部分和作用,以及Rails中对MIME类的处理,希望大家有所了解。
参考链接:https://github.com/nateyu/nateyu.github.com/blob/master/_posts/2014-09-08-railsde-zhong-de-mime-type.markdown
Rails中的MIME类型的更多相关文章
- 如何在ASP.NET的web.config配置文件中添加MIME类型
常常有一些特殊的MIME类型是IIS中没有的,一般来说要我们自己手动添加.如果网站经常更换服务器或者网站代码是提供给多个用户使用,那么会造成网站中用到的特殊的MIME类型要经常性的在IIS上配置.这里 ...
- Windows Server 2008 如何在IIS中添加MIME类型
用户可以通过使用MIME以设置服务器传送多媒体文件,如声音和视频等.MIME是一种技术规范,现在可以用于浏览器上,传送可以供浏览器识别的信息 如果我们的网站提供下载服务,有时传上去的文件比如 xxx. ...
- IIS中添加MIME类型
今天上传一个html5后台管理模版的时候,在服务器上预览发现网页加载的远程woff类型的字体不显示,如下图所示: 在本地预览的时候,正常加载字体文件应该是这样的: 利用url访问字体文件的时候提示:该 ...
- [转发]如何在ASP.NET的web.config配置文件中添加MIME类型
常常有一些特殊的MIME类型是IIS中没有的,一般来说要我们自己手动添加.如果网站经常更换服务器或者网站代码是提供给多个用户使用,那么会造成网站中用到的特殊的MIME类型要经常性的在IIS上配置.这里 ...
- html标签中的 MIME 类型
1.<script type="text/x-template"> MIME 类型 2.MIME类型是什么 : http://www.w3school.com.cn/ ...
- Http中常见MIME类型
MIME类型 常见MIME类型: 超文本标记语言文本 .html text/html xml文档 .xml text/xml XHTML文档 .xhtml application/xhtml+xml ...
- 在网站中配置MIME类型
经常会遇到这样的情况,某种类型的文件不能够正常下载,*.7z,自定义的文件类型等,需要在配置文件里配置后才能正常下载. 打开Web.Config文件: <system.webServer> ...
- IIS中的MIME类型设置
https://www.cnblogs.com/David-Young/p/5323949.html
- MIME类型(JSP中)
什么是MIME类型-在把输出结果传送到浏览器上的时候,浏览器必须启动是党的应用程序来处理这个输出文档.这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成.在HTTP中,MIME类型被定义在Co ...
随机推荐
- Qt5.4生成安装包过程
所需工具: 1. HM NIS Edit 2. windeployqt.exe 第一个工具需要自己去网上下载,第二个工具可以在qt安装目录下找到:D:\qtopengl\5.4\mingw491_ ...
- struts2使用struts2-bootstrap-plugin插件
1.下载插件 http://code.google.com/p/struts2-bootstrap/ 2.添加maven依赖 <dependency> <groupId>com ...
- C# 实现HTML5服务器推送事件
为什么需要服务器推送事件: 因为如果需要保持前台数据的实时更新例如,IM聊天,股票信息, 1.可以在客户端不断地调用服务端的方法来获得新数据,但是这样会很消耗服务器资源,导致系统变慢! 2 html5 ...
- c#winform,制作可编辑html编辑器
大神勿喷,新手记笔记 材料 网上下载kindeditor,动手在写个htmldome,图中的e.html.然后全部扔到了bin/debug下面,(x86是要扔到bin/x86/debug) 中间bod ...
- WinForm窗体间如何传值的几种方法
(转) 窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点: ...
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- 如何设置eclipse开发的web工程自动发布到tomcat的webapps下?
使用eclipse开发web工程,在配置好服务器(tomcat)之后运行该web工程,发现能正常运行.但是问题在于,当你打开tomcat路径\webapps时,会发现没有该web应用(你的web工程名 ...
- Have Fun with Numbers (大数)
Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, wit ...
- Linux远程备份—ftp方式、NFS方式
问题:现在项目中每天都有从其它各个系统发过来的数据文件(存放在/var/data目录下,以.txt结尾),虽然很久以前的文件很少用到,占用了很多空间,却不能删除.于是,想把一个月以前的文件都压缩了传到 ...
- 【通信】Netty JBOSS提供的一个java开源框架
Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序dsf. 也就是说,Netty 是一个基 ...