分享

[javascript]HTTP 工具函数

 百眼通 2014-10-30
[javascript] view plaincopy
  1. var HTTP = {};  
  2.   
  3. //下面是一个创建 XMLHttpRequest 对象工厂函数列表  
  4. HTTP._factories = [  
  5.  function() { return new XMLHttpRequest(); },  
  6.  function() { return new ActiveXObject("Msxml2.XMLHTTP"); },  
  7.  function() { return new ActiveXObject("Microsoft.XMLHTTP"); }  
  8. ];  
  9.   
  10. //当工厂函数调用之后,在这里存储返回结果  
  11. HTTP._factory = null;  
  12.   
  13. //创建并返回 XMLHttpRequest 对象  
  14. HTTP.newRequest = function() {  
  15.     if(HTTP._factory !=null ) return HTTP._factory();  
  16.   
  17.     for(var i = 0; i < HTTP._factories.length; i++) {  
  18.         try  
  19.         {  
  20.             var factory = HTTP._factories[i];  
  21.             var request = factory();  
  22.             if (request != null)  
  23.             {  
  24.                 HTTP._factory = factory;  
  25.                 return request;  
  26.             }  
  27.         }  
  28.         catch (e)  
  29.         {  
  30.         continue;  
  31.         }  
  32.     }  
  33.   
  34.     //如果到这里没有工厂函数创建成功,抛出异常  
  35.     HTTP._factory = function() {  
  36.         throw new Error("XMLHttpRequest not support");  
  37.     }  
  38.     HTTP._factory();//抛出错误  
  39. };  
  40.   
  41. //使用XMLHttpRequest来获取指定的URL的内容使用一个HTTP GET请求。当respoonse到来时,通过它(纯文本)来指定的回调函数  
  42. HTTP.getText = function(url, callback) {  
  43.     var request = HTTP.newRequest();  
  44.     request.onreadystatechange = function() {  
  45.         if(request.readyState == 4 && request.status == 200)  
  46.             callback(request.responseText);  
  47.     }  
  48.     request.open("GET", url);  
  49.     request.send(null);  
  50. }  
  51.   
  52. //用来接收XML文档,并将其解析后的表示传递给一个回调函数  
  53. HTTP.getXML = function(url, callback) {  
  54.     var request = HTTP.newRequest();  
  55.     request.onreadystatechange = function() {  
  56.         if(request.readyState == 4 && request.status == 200)  
  57.             callback(request.responseXML);  
  58.     }  
  59.     request.open("GET", url);  
  60.     request.send(null);  
  61. }  
  62.   
  63. /** 
  64.  *使用一个HTTP HEAD请求获取指定的URL的headers。当headers到达,用HTTP.parseHeaders()解析它,把结果传给回调函数。 
  65.  *如果服务器返回一个错误代码,调用指定的errorHandler函数。如果没有指定错误句柄,将null传递给该回调函数。 
  66.  * 
  67.  */  
  68. HTTP.getHeaders = function(url, callback, errorHandler) {  
  69.     var request = HTTP.newRequest();  
  70.     request.onreadystatechange = function() {  
  71.         if(request.readyState == 4) {  
  72.             if(request.status == 200) {  
  73.                 callback(HTTP.parseHeaders(request));  
  74.             }  
  75.             else{  
  76.                 if(errorHandler) errorHandler(request.status, request.statusText);  
  77.                 else callback(null);  
  78.             }  
  79.         }  
  80.     }  
  81.     request.open("HEAD", url);  
  82.     request.send(null);  
  83. };  
  84.   
  85. /** 
  86.  *从一个XMLHttpRequest对象解析响应头,作为一个新对象的属性名和属性值返回header的名和值 
  87.  * 
  88.  */  
  89.  HTTP.parseHeaders = function(request) {  
  90.     var headerText = request.getAllResponseHeaders(); //从服务器返回文本  
  91.     var headers = {}; //这里是返回值  
  92.     var ls = /^\s*/; //前面空格正则表达式  
  93.     var ts = /\s*$/; //后面空格正则表达式  
  94.   
  95.     //把headers分割为数组  
  96.     var lines = headerText.split("\n");  
  97.     for(var i = 0; i < lines.length; i++){  
  98.         var line = lines[i];  
  99.         if(lines.length == 0) continue; //数组为空,跳过  
  100.         //以冒号分割line,去掉空格  
  101.         var pos = line.indexOf(":");  
  102.         var name = line.substring(0, pos).replace(ls, "").replace(ts, "");  
  103.         var value = line.substring(pos+1).replace(ls, "").replace(ts, "");  
  104.         //将 name/value 对,存入javascript对象  
  105.         headers[name] = value;  
  106.     }  
  107.     return headers;  
  108.  };  
  109.   
  110. //向指定的url发送一个HTTP POST请求,用对象的属性名和属性值作为请求体,根据它的内容类型解析服务器的响应,  
  111. //通过结果值回调函数,如果一个http错误发生时,调用指定的errorHandler功能,如果没有指定错误处理程序返回null  
  112. HTTP.post = function(url, values, callback, errorHandler) {  
  113.     var request = HTTP.newRequest();  
  114.     request.onreadystatechange = function() {  
  115.         if(request.readyState == 4) {  
  116.             if(request.status == 200) {  
  117.                 callback(HTTP._getResponse(request));  
  118.             }  
  119.             else {  
  120.             if(errorHandler) errorHandler(request.status, request.statusText);  
  121.             else callback(null);  
  122.         }  
  123.     }  
  124. }  
  125.   
  126. request.open("POST", url);  
  127.   
  128. //头信息告诉服务器如何解释请求的主体  
  129. request.setRequestHeader("Content-type","application/x-www-form-urlencoded");  
  130.   
  131. //编码对象的属性和值,并将它们发送为请求的主体  
  132. request.send(HTTP.encodeFormData(values));  
  133. };  
  134.   
  135. //编码 属性名称/值对 的一个对象就好像他们是来自html表单,使用 application/x-www-form-urlencoded 格式  
  136. HTTP.encodeFormData = function(data) {  
  137.     var pairs = [];  
  138.     var regexp = /%20/g; //匹配编码后的空格  
  139.     for(var name in data) {  
  140.         var value = data[name].toString();  
  141.         //首先创建属性名/值对,并编码它们.全球函数encodeURIComponent几乎是我们想要的,但它编码空格为为% 20,而不是"+"。我们必须用String.replace()解决.  
  142.         var pair = encodeURIComponent(name).replace(regexp,"+") + '=' + encodeURIComponent(value).replace(regexp,"+");  
  143.         pairs.push(pair);  
  144.     }  
  145.     return pairs.join('&');  
  146. };  
  147.   
  148. HTTP._getResponse = function(request) {  
  149.   
  150. //检查服务器返回的内容类型  
  151. switch(request.getResponseHeader("Content-Type")) {  
  152.     case "text/xml":  
  153.     //如果它是一个XML文档,使用解析文档对象  
  154.     return request.responseXML;  
  155.     case "text/json":  
  156.     case "text/javascript":  
  157.     case "application/javascript":  
  158.     case "application/x-javascript":  
  159.     //如果响应是javascript代码,或一个json编码的值,调用eval()在文本“解析”到一个javcascript值  
  160.     //注意:只有jacascript代码是来自受信任的服务器,才这样做。  
  161.     return eval(request.responseText);  
  162.   
  163.     default:  
  164.     //否则,把响应作为普通文本并返回字符串  
  165.     return request.responseText;  
  166. }  
  167. };  
  168.   
  169. //接收返回的内容  
  170. function doFun(content) {  
  171.   
  172. }  
  173.   
  174. //错误句柄函数  
  175. function errorFun(stat,statext) {  
  176.     alert("状态:" + stat + "\n" + "错误:" + statext);  
  177. }  


使用:

[javascript] view plaincopy
  1. //提交表单,调用POST方法  
  2. var uname = document.getElementById("username");  
  3. var usex = document.getElementById("sex");  
  4. var formdata = {'username':'tom','sex':'男'};  
  5.     HTTP.post("./test.php",formdata, doFun, errorFun);  

[javascript] view plaincopy
  1. //请求获取指定的URL的headers  
  2. HTTP.getHeaders("./a.html", doFun, errorFun);  


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多