XMLHttpRequest示例解析

示例代码

前言:本代码用JS语言书写,适用于短链接请求(即接口请求),可直接拿用。之前都是在别人搭建的网络请求下工作,这是第一份自己的网络接口请求封装,写的不好的地方还望谅解和留言指出。websocket长连接后面如果有机会,会更新分享出来。对Promise对象不熟悉的同学,可以移步我的另一篇文章:Promise学习参考(入门级)

let gameIp = '';//服务器地址
let HttpUtils = cc.Class({
    /*option {
        url,//必传
        data,//必传
        header, //暂时用不到
        method,//必传 
        dataType(json|arraybuffer)}
    */
    _request(option) {
        return new Promise((resolve, reject) => {
            //拼接接口函数IP地址
            option.url = "".concat(gameIp).concat(option.url);
            //创建XMLHttpRequest对象
            let xhr = new XMLHttpRequest();
            //设置网络请求超时时间,如下 设置为3s 当时间已过,请求尚未完成,同步标志未设置时,将分派超时事件
            xhr.timeout = 6000;
            //当readyState状态值(0-4)改变时调用该函数onreadystatechange
            //当创建了XMLHttpRequest对象后,要先设置onreadystatechange的回调函数。
            //在回调函数中,通常我们只需通过readyState === 4判断请求是否完成,如果已完成,再根据status === 200判断是否是一个成功的响应。
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    let response = {data:xhr.response};
                    if(xhr.status === 200){
                        resolve(response);
                    }else{
                        reject(response);
                    }
                }
                // else{
                //     //HTTP请求还在继续...
                // }
            };
            
			xhr.ontimeout = function(e){
                log.err('http post time out:', e);
                let timeout = {message: `${e}`, code: `${ERRORCODE.TIMEOUT}`};
                return reject(timeout);
            };

            xhr.onerror = function(e){
                log.err('http post onerror:', e);
                let error = {message: `${e}`, code: `${ERRORCODE.ONERROR}`};
                return reject(error);
            };
         
            //GET请求方式,把参数拼接到url里面去
            if(option.method == 'GET' && option.data){
                let content = "";
                for(let _key in option.data){
                    let _value = option.data[_key];
                    content += _key + "=" + _value + "&";
                }
                content = content.substring(0, content.length-1);
                option.url += `?${content}`;
            }
            //缓存清理
            option.url += `?${(new Date()).getTime()}`;
            //第一个参数指定是GET还是POST,第二个参数指定URL地址,第三个参数指定是否使用异步,默认是true,可以不用写。
            xhr.open(option.method, option.url, true); 
            //设置请求头内容 按需求设置,也可不设。
            xhr.setRequestHeader('Test', '测试');
            //http请求编码格式,除此之外还有三种。其中formdata格式也比较常用,这里不再补充,请另行搜索。
            xhr.setRequestHeader('Content-Type', 'application/json');
            //设置服务器接口响应返回数据类型
            xhr.responseType = 'json';
            if(option.data){
                let content = JSON.stringify(option.data);
                xhr.send(content);
            }else{
                //无参数传输
                xhr.send();
            }
        });
    },

    /** 
    method: 请求方式 GET POST
    url:    接口url
    parms:  参数{}
    suc:    成功回调
    fail:   失败回调
    */
    Request(method, url, params, suc, fail){
        if(Global.sid == '' || Global.sid.length == 0){
            console.log('Global.sid error===>', Global.sid);
            return;
        }
        this._request({
            url:url,
            method: method,
            data:params,
        }).then((resp)=>{
            console.log("http请求成功:", resp);
            let data = resp.data;
            if(data.code == '200'){//code为200表示请求成功
                suc && suc.call(this, data);
            }else{
                fail && fail.call(this, data);
            }
        }).catch((e)=>{
            console.log("http请求失败", e);
        })
    },
});

//单例模式
HttpUtils.getInstance = function () {
    if (HttpUtils.instance == null) {
        HttpUtils.instance = new HttpUtils();
    }
    return HttpUtils.instance;
}

至此,完毕。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值