HTTP 工具函数

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功能,如果没有指定错误处理程序返回null
HTTP.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的headers
HTTP.getHeaders("./a.html", doFun, errorFun);


你可能感兴趣的:(javascript)