前端攻城师
前端攻城师
  • 发布:2017-10-27 11:38
  • 更新:5 天前
  • 阅读:1020

【分享】关于ajax的几个方法(方便自己下次用,包括错误处理、日志处理、加密处理)

分类:MUI
/* 参数列表  
 * url 请求的地址后缀(必填)  
 * params 请求的参数(必填:如果没有参数,则传个空对象)  
 * onSuccess 请求成功的回调方法(选填)  
 * noData 请求成功但无数据的回调方法(选填)  
 * retry 请求自动重试的次数(选填)  
 * describe 请求的描述,用来提示错误信息(选填)  
 */  
function bpAjax(url, params, onSuccess, noData, retry, describe) {  
    plus.nativeUI.showWaiting();  
    var address = arguments[0];  
    var url = USERINFO.DL_HOST + arguments[0];  
    var onSuccess = arguments[2] ? arguments[2] : function() {};  
    var noData = arguments[3] ? arguments[3] : function() {};  
    var retry = arguments[4] ? arguments[4] : 3;  
    var params = params;  
    console.log(describe + '参数' + JSON.stringify(params));  
    if(!params.sign) params.sign = getRSA(params, describe) //当sign为空时,自动给键值排序生成sign  
    mui.ajax(url, {  
        data: params,  
        dataType: 'json', //服务器返回json格式数据  
        type: 'post', //HTTP请求类型  
        timeout: 10000, //超时时间设置为10秒;  
        success: function(data) {  
            plus.nativeUI.closeWaiting();  
            console.log(describe + '——' + data);  
            var d = JSON.parse(data);  
            if(d.msg == '1') {  
                onSuccess(d);  
            } else if(d.msg == '3') {  
                //localStorage.clear();  
                mui.toast(d.info);  
                onError('INVALID_TOKEN');  
            } else if(d.msg == '99'){  
                mui.toast(d.info);  
            }else {  
                noData(d);  
            }  
        },  
        error: function(xhr, type, errorThrown) {  
            plus.nativeUI.closeWaiting();  
            console.log(describe + '__' + errorThrown);  
            retry--;  
            if(retry > 0) return bpAjax(address, params, onSuccess, noData, retry, describe);  
            onError('FAILED_NETWORK', describe);  
        }  
    });  
}  

========================华丽的分隔线========================

/* 参数列表  
 * errcode 错误编码(必填)  
 * 可选值:'FAILED_NETWORK' 重连多次不成功网络不佳  
 * 可选值:'INVALID_TOKEN' 无效的token  
 */  
function onError(errcode, describe) {  
    switch(errcode) {  
        case 'FAILED_NETWORK':  
            mui.toast('当前网络不佳');  
            break;  
        case 'INVALID_TOKEN':  
            openWV('login.html');  
            break;  
        default:  
            console.log(describe + '——' + errcode);  
    }  
}  

========================华丽的分隔线========================

/* 需要RSA加密的对象,按对象键值排序加密 参数列表  
 * o参数为对象,  
 * 逻辑:需要RSA加密的对象,按对象键值排序加密,并返回  
 * DL_RED_PACKET 字符串是跟后台协定的  
 */  
function getRSA(o, describe) {  
    var encrypt = new JSEncrypt();  
    encrypt.setPublicKey(USERINFO.DL_PUBLIC_KEY); //设置公有key  
    var keys = Object.keys(o).sort();  
    if(arguments.length <= 0) return false;  
    var str = '';  
    for(var i = 0; i < keys.length; i++) {  
        if(keys[i] != 'sign') {  
            str += o[keys[i]];  
        }  
    }  
    var sign = '';  
    str = encodeURI(str + 'DL_RED_PACKET');  
    for(var i = 0; i <= parseInt(str.length / 117); i++) {  
        sign += encrypt.encrypt(str.substr(i * 117, 117))  
    }  
    return sign;  
}  
3 关注 分享
Neil_HL Trust fyw2lyf@163.com

要回复文章请先登录注册

熊二的二

熊二的二

mark
5 天前
前端攻城师

前端攻城师 (作者)

回复 回梦無痕:
有道理,有时间再弄一下
2017-10-27 15:23
回梦無痕

回梦無痕

如果只在APP端运行的话,二次封装最好是封装plus.net.XMLHttpRequest()这个,毕竟mui不一定每个项目都会使用。
2017-10-27 15:09