瘦人说

Mr.Http based on Ajax

Mr&Ms lab一直没有用到项目里面的原因除了希望更多的Testing之外,另一个很重要的原因就是没有ajax的支持(由于本人比较懒造成的)。现在,我把对Ajax的支持加入到了Mr&Ms.js里面,并把这个模块命名为Mr.Http。

Mr.Http模块包含两个方法,一个是传统的ajax封装叫做Mr.http,另一个是对multipart/form-data内容提交的扩展叫做Mr.mhttp,m就是multipart的意思。

Mr.http

这个方法的使用基本上和jquery中$.ajax一模一样,只是调用的属性换了另一个名字,比如type : ‘GET’,我用的是method : ‘GET’如此而已,目的是更接近http协议的语义。所以不用担心此方法的复杂性。API会在稍后我整理的Mr库的API文档中介绍,敬请期待。

Mr.mhttp

当然,如果你想用multipart/form-data的方式提交数据,尤其是想上传文件的时候,可以使用mhttp这个方法了。

看了很多人写过对ajax对象扩展,但是没见过封装的,对form提交或者HTTP协议熟悉的人都应该知道原理,我在这里就不做理论说明了。除了对multipart/form-data方式的支持,我还做了一些特别的处理:

  1. File Base64编码提交,mhttp方法现在是默认接受file的base64编码,ajax对象提交也是提交file的base64编码,为什么要这样,是因为ajax的send方法发送的是字符串,如果文件利用二进制格式的话,数据会丢失。所以如果利用HTML5的File API或者FileReader对象读取文件数据时,默认情况下请使用Base64读取方式。当然,在服务器端就不得不反解析base64再去保存文件,不得已而为之呀。
  2. sendAsBinary方式的支持,如果你的浏览器XMLHttpRequest对象支持这个方法,你可以在使用mhttp方法时设置useBinary属性为true,整个HTTP包将会以二进制方式发送,在这种情况下,浏览器读取文件时可以使用读取二进制方式,而且服务器端也不用做任何处理,相当之爽。但是目前只有FF支持这个方法,只有期待以后对XMLHttpRequest对象的更新。
  3. 之前我聊过进度条,所以我让http和mhttp方法都支持了onuploadprogress事件,使用时传入的第一个参数是进度:percent(e.g 0.4),第二个参数是事件对象evt,evt.position和evt.totalSize是它的两个重要属性,看一下名字也能YY出它的意义了,爽是很爽,但是现在也只有FF支持。
  4. 上述中,如果要使用Mr.mhttp的一些特性,可以从Mr.http上得到兼容性结果,Mr.http.supportBinary检测是否支持binary发送数据,Mr.http.supportUploadProgress检测是否支持进度事件,以后也会有更多。但是我个人希望这种兼容性检测的方法我以后少写才好,随着浏览器的功能进步,慢慢都会支持的。=。=!

之前利用drag and drop写了一个图片的展示示例,现在我进一步加强写了一个文件上传的sample,本人不才不会写php,写了一个ASP.NET MVC的版本,是VS2010工程。有兴趣的可以到svn地址下载:

Mr.Http file upload sample svn address,注意,是SVN地址。

 

Comments

Proudly published with Hexo