XMLHttpRequest从简单使用到兼容jQuery异步请求封装

虽然XMLHttpRequest这个对象使用很简单,但很少有人用好,我比较喜欢使用js原生对象,因为大多数时候不需要安装什么工具,直接打开浏览器控制台即可完成很多功能,写这个的目的也是方便要用的时候能从这里很快复制使用。

1、XMLHttpRequest简称xhr,使用步骤按顺序一般分为5步:

1.1、实例化一个xhr对象,考虑兼容性:var xhr = XMLHttpRequest && new XMLHttpRequest() || new ActiveXObject();

1.2、设置状态改变的响应处理事件,一般状态为4时表示请求响应完成:xhr.onreadystatechange = callback;

1.3、使用open函数打开连接,接受三个参数,分别是请求方法、请求路径、是否异步请求:xhr.open(method, url, isAsyc);

1.4、设置header、cookie等:xhr.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded; charset=UTF-8‘);

1.5、使用send函数发起请求,接受一个需要发送的数据参数:xhr.send(params);

 

2、使用xhr发起get请求比较简单,代码如下:

var xhr = XMLHttpRequest && new XMLHttpRequest() || new ActiveXObject();
xhr.onreadystatechange = c => {            
    if (c.target.readyState == 4) {
        console.log(c.target.responseText);
    }
};
xhr.open(‘GET‘, ‘/login?username=ruphy&passwd=123456‘, true);
xhr.send();

 

3、使用xhr发起post请求,一般就两种格式,一种是键值对字符串,另一种是form表单

3.1、发送的数据使用&号连接的键值对字符串时(如:‘username=ruphy&passwd=123456‘),代码如下:

var xhr = XMLHttpRequest && new XMLHttpRequest() || new ActiveXObject();
xhr.onreadystatechange = c => {
    if (c.target.readyState == 4) {
        console.log(c.target.responseText);
    }
};
xhr.open(‘POST‘, ‘/login‘, true);
xhr.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded; charset=UTF-8‘);
xhr.send(‘username=ruphy&passwd=123456‘);

 

3.2、发送的数据使用form表单方式时(通常发送JSON对象),代码如下:

var xhr = XMLHttpRequest && new XMLHttpRequest() || new ActiveXObject();
xhr.onreadystatechange = c => {
    if (c.target.readyState == 4) {
        console.log(c.target.responseText);
    }
};
xhr.open(‘POST‘, ‘/login‘, true);
var fd = new FormData();
fd.append(‘username‘, ‘ruphy‘);
fd.append(‘passwd‘, ‘123456‘);
xhr.send(fd);

 

3.3、一般情况下,当参数为json对象时,我比较喜欢将json对象转为form表单形式发送,json转form表单的代码如下:

var params = {username: ‘ruphy‘, passwd: ‘123456‘};
var fd = new FormData();
for (var k in params) {
    fd.append(k, params[k]);
}

 

4、上面就是使用xhr发送get和post请求的基本用法,下面使用函数简单封装一下,兼容jQuery的$.get和$.post方法、支持回调函数方式和promise方式处理响应结果

4.1、封装get请求,代码如下:

var get = function (url, params, func, type) {
    if(typeof params === ‘function‘){
        func = params;
        params = undefined;
    }
    if(params){
        !/\?/.test(url) && url += "?";
        if(typeof params !== ‘string‘){
            for(var k in params){
                url +=k + ‘=‘ + params[k];
            }
        } else {
            url += params;
        }
    }
    var promiss = new Promise(function (resolve, reject) {
        var xhr = XMLHttpRequest && new XMLHttpRequest() || new ActiveXObject();
        xhr.onreadystatechange = c => {
            if (c.target.readyState == 4) {
                func && func.call(c.target.responseText, c.target.responseText, c.target.status); // 回调函数存在时调用回调函数,返回数据和状态
                if(c.target.status < 300){
                    resolve && resolve(c.target.responseText); // 成功时调用resolve函数
                } else {
                    reject && reject(c.target.responseText);   // 失败时调用reject函数
                }
                console.log(c.target.responseText);
            }
        };
        xhr.open(‘GET‘, url, true);
        xhr.send();
    });
    return promiss;
}

 

4.2、封装post请求,代码如下:

var post = function (url, params, func) {
    if(typeof params === ‘function‘){
        func = params;
        params = undefined;
    }
    var promiss = new Promise(function (resolve, reject) {
        var xhr = XMLHttpRequest && new XMLHttpRequest() || new ActiveXObject();
        xhr.onreadystatechange = c => {
            if (c.target.readyState == 4) {
                console.log(c.target.responseText);
                func && func.call(c.target.responseText, c.target.responseText, c.target.status); // 回调函数存在时调用回调函数,返回数据和状态
                if(c.target.status < 300){
                    resolve && resolve(c.target.responseText); // 成功时调用resolve函数
                } else {
                    reject && reject(c.target.responseText);   // 失败时调用reject函数
                }
            }
        };
        xhr.open(‘POST‘, ‘/login‘, true);
        if(typeof params === ‘string‘){
            xhr.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded; charset=UTF-8‘);
            xhr.send(params);
        } else {
            // xhr.setRequestHeader(‘Content-Type‘, ‘multipart/form-data; charset=UTF-8‘); 不需要设置
            var fd = new FormData();
            for (var k in params) {
                fd.append(k, params[k]);
            }
            xhr.send(fd);
        }
    });
    return promiss;
}

 

4.3、调用方式,post为例:

4.3.1、回调函数方式

post(‘/login‘, {username: ‘ruphy‘, passwd: ‘123456‘}, (data, status)=>{
    console.log(data);
    //其他业务处理
});

4.3.2、promise异步方式

post(‘/login‘, {username: ‘ruphy‘, passwd: ‘123456‘})
.then(data=>{
    console.log(data);
    // 其他业务处理
},err=>{
    console.log(err);
    // 其他错误处理
});

 

XMLHttpRequest从简单使用到兼容jQuery异步请求封装

上一篇:06-flask-文件上传案例


下一篇:java数组排序之冒泡排序