用原生js封装了一个ajax请求方法

实现功能

  • 可以实现常用的get/post请求
  • 支持text/json/xml几种返回数据类型
  • 返回的是一个Promise对象

参数:options

  • url: 请求地址
  • dataType: 数据格式,text/json/xml,默认text,不区分大小写
  • method: 请求方式,默认get,不区分大小写
  • data: 请求参数,oject类型

注意:get请求若需带参数,参数仍丢入data属性,自动拼接url

测试:

  • 写了两个简单的php程序测试了post和get请求
  • 请求了4种不同类型数据的本地文件,包括:数组、对象、文本、xml

不足之处

  • 除常用的post/get请求外,其他请求方式不熟悉,没测试过,可能会不适用
  • 方法返回的是Promise对象,不是最终结果(以后有空再琢磨)

代码

ajax代码

这段代码是封装的方法主体,注意的是,请求方法返回的是Promise对象。

myAjax.js

/**
 * ajax请求
 * @description 自己写的ajax请求
 * @param {Object} options 请求配置信息
 * @param {String} options.url 请求地址
 * @param {String} options.dataType 数据格式 json/text/xml
 * @param {String} options.method 请求方式,默认get
 * @param {Object} options.data 请求参数,json格式
 * [options={url, dataType, method}]
 * @returns {Object} 返回一个Promise对象
 */
function myAjax(options) {
    function transformData(object){
        let oStr = '';
      for(var key in object){
        oStr += key+"="+object[key]+"&";
      };
      return oStr.slice(0,-1);
    };
    return new Promise(function (resolve, reject) {
        let method = options.method ? options.method.toUpperCase() : 'GET';
        let xhr = new XMLHttpRequest();//创建请求对象
        if (method === 'POST') {
            xhr.open(method, options.url);//连接服务器
            xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");//post请求添加请求头
            xhr.send(transformData(options.data));//发送请求,带处理过的参数
        } else if(method === 'GET') {
            let url = options.data ? options.url + '?' + transformData(options.data) : options.url;
            xhr.open(method, url);//get请求url需要拼接参数
            xhr.send();
        } else {//其他请求方式
            xhr.open(method, options.url);
            xhr.send();
        };
        //接收返回结果
        xhr.onreadystatechange = () => {
            if (xhr.readyState === 4) {
                if (
                    (xhr.status >= 200 && xhr.status < 300) ||
                    xhr.status === 304
                ) {
                    let dataType = options.dataType || 'TEXT',
                        data = null;
                    switch (dataType.toUpperCase()) {
                        case 'JSON':
                            data = JSON.parse(xhr.responseText);
                            break;
                        case 'TEXT':
                            data = xhr.responseText;
                            break;
                        case 'XML':
                            data = xhr.responseXML;
                            break;
                    };
                    resolve(data);
                } else {
                    reject({
                        statusCode: xhr.status,
                        msg: '请求错误'
                    });
                }
            };
        }
    });
};

测试代码

分别测试了get/post请求,用两个Promise.all获取最终的结果。

测试的文件和php代码,感兴趣可以到我的github获取一下

//测试用例

//post请求
let ajax_post = myAjax({url:'program/test_post.php', method:'POST', dataType: 'json', data: {name:'ysh',age:23}});
//get请求
let ajax_get = myAjax({url:'program/test_get.php', method:'GET', dataType: 'json', data: {name:'ysh',age:23}});
Promise.all([ajax_post, ajax_get]).then(res => {
    console.log(res);
}).catch( err => {
    console.log('请求出错了', err);
});

//资源get请求
let arr = myAjax({url:'data/arr.txt', dataType: 'json'}),
    json = myAjax({url:'data/json.txt', dataType: 'json'}),
    text = myAjax({url:'data/text.txt', dataType:'text'}),
    xml = myAjax({url:'data/xmlData.xml', dataType:'xml'});
Promise.all([arr, json, text, xml]).then(res => {
    console.log(res);
}).catch(err => {
    console.log('请求出错了', err);
});

结果打印如下图。
因为是异步请求,两个Promise.all结果打印的顺序要看他们请求完成的先后来决定。这里第二个Promise.all的结果反而先打印了,因为我这里有缓存,所以文件请求比较快,php程序需要处理,稍微慢一些。如果放在真正的公网环境,顺序可能会不一样。
测试结果


以上,就是我自己封装的一个ajax请求方法,欢迎拍砖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值