HTTP 工具函数

来源:互联网 发布:edius4.7软件下载 编辑:程序博客网 时间:2024/06/08 08:52
var HTTP = {};//下面是一个创建 XMLHttpRequest 对象工厂函数列表HTTP._factories = [ function() { return new XMLHttpRequest(); }, function() { return new ActiveXObject("Msxml2.XMLHTTP"); }, function() { return new ActiveXObject("Microsoft.XMLHTTP"); }];//当工厂函数调用之后,在这里存储返回结果HTTP._factory = null;//创建并返回 XMLHttpRequest 对象HTTP.newRequest = function() {    if(HTTP._factory !=null ) return HTTP._factory();    for(var i = 0; i < HTTP._factories.length; i++) {        try        {            var factory = HTTP._factories[i];            var request = factory();            if (request != null)            {                HTTP._factory = factory;                return request;            }        }        catch (e)        {        continue;        }    }    //如果到这里没有工厂函数创建成功,抛出异常    HTTP._factory = function() {        throw new Error("XMLHttpRequest not support");    }    HTTP._factory();//抛出错误};//使用XMLHttpRequest来获取指定的URL的内容使用一个HTTP GET请求。当respoonse到来时,通过它(纯文本)来指定的回调函数HTTP.getText = function(url, callback) {    var request = HTTP.newRequest();    request.onreadystatechange = function() {        if(request.readyState == 4 && request.status == 200)            callback(request.responseText);    }    request.open("GET", url);    request.send(null);}//用来接收XML文档,并将其解析后的表示传递给一个回调函数HTTP.getXML = function(url, callback) {    var request = HTTP.newRequest();    request.onreadystatechange = function() {        if(request.readyState == 4 && request.status == 200)            callback(request.responseXML);    }    request.open("GET", url);    request.send(null);}/** *使用一个HTTP HEAD请求获取指定的URL的headers。当headers到达,用HTTP.parseHeaders()解析它,把结果传给回调函数。 *如果服务器返回一个错误代码,调用指定的errorHandler函数。如果没有指定错误句柄,将null传递给该回调函数。 * */HTTP.getHeaders = function(url, callback, errorHandler) {    var request = HTTP.newRequest();    request.onreadystatechange = function() {        if(request.readyState == 4) {            if(request.status == 200) {                callback(HTTP.parseHeaders(request));            }            else{                if(errorHandler) errorHandler(request.status, request.statusText);                else callback(null);            }        }    }    request.open("HEAD", url);    request.send(null);};/** *从一个XMLHttpRequest对象解析响应头,作为一个新对象的属性名和属性值返回header的名和值 * */ HTTP.parseHeaders = function(request) {    var headerText = request.getAllResponseHeaders(); //从服务器返回文本    var headers = {}; //这里是返回值    var ls = /^\s*/; //前面空格正则表达式    var ts = /\s*$/; //后面空格正则表达式    //把headers分割为数组    var lines = headerText.split("\n");    for(var i = 0; i < lines.length; i++){        var line = lines[i];        if(lines.length == 0) continue; //数组为空,跳过        //以冒号分割line,去掉空格        var pos = line.indexOf(":");        var name = line.substring(0, pos).replace(ls, "").replace(ts, "");        var value = line.substring(pos+1).replace(ls, "").replace(ts, "");        //将 name/value 对,存入javascript对象        headers[name] = value;    }    return headers; };//向指定的url发送一个HTTP POST请求,用对象的属性名和属性值作为请求体,根据它的内容类型解析服务器的响应,//通过结果值回调函数,如果一个http错误发生时,调用指定的errorHandler功能,如果没有指定错误处理程序返回nullHTTP.post = function(url, values, callback, errorHandler) {    var request = HTTP.newRequest();    request.onreadystatechange = function() {        if(request.readyState == 4) {            if(request.status == 200) {                callback(HTTP._getResponse(request));            }            else {            if(errorHandler) errorHandler(request.status, request.statusText);            else callback(null);        }    }}request.open("POST", url);//头信息告诉服务器如何解释请求的主体request.setRequestHeader("Content-type","application/x-www-form-urlencoded");//编码对象的属性和值,并将它们发送为请求的主体request.send(HTTP.encodeFormData(values));};//编码 属性名称/值对 的一个对象就好像他们是来自html表单,使用 application/x-www-form-urlencoded 格式HTTP.encodeFormData = function(data) {    var pairs = [];    var regexp = /%20/g; //匹配编码后的空格    for(var name in data) {        var value = data[name].toString();        //首先创建属性名/值对,并编码它们.全球函数encodeURIComponent几乎是我们想要的,但它编码空格为为% 20,而不是"+"。我们必须用String.replace()解决.        var pair = encodeURIComponent(name).replace(regexp,"+") + '=' + encodeURIComponent(value).replace(regexp,"+");        pairs.push(pair);    }    return pairs.join('&');};HTTP._getResponse = function(request) {//检查服务器返回的内容类型switch(request.getResponseHeader("Content-Type")) {    case "text/xml":    //如果它是一个XML文档,使用解析文档对象    return request.responseXML;    case "text/json":    case "text/javascript":    case "application/javascript":    case "application/x-javascript":    //如果响应是javascript代码,或一个json编码的值,调用eval()在文本“解析”到一个javcascript值    //注意:只有jacascript代码是来自受信任的服务器,才这样做。    return eval(request.responseText);    default:    //否则,把响应作为普通文本并返回字符串    return request.responseText;}};//接收返回的内容function doFun(content) {}//错误句柄函数function errorFun(stat,statext) {    alert("状态:" + stat + "\n" + "错误:" + statext);}


使用:

//提交表单,调用POST方法var uname = document.getElementById("username");var usex = document.getElementById("sex");var formdata = {'username':'tom','sex':'男'};    HTTP.post("./test.php",formdata, doFun, errorFun);

//请求获取指定的URL的headersHTTP.getHeaders("./a.html", doFun, errorFun);


原创粉丝点击