Ajax访问接口封装

90 阅读1分钟
/*REST Ajax访问接口封装*/
/*<script src="../assets/restajax.js"></script>*/

(function (factory) {

/* CommonJS */

if (typeof exports == 'object') {

    module.exports = factory(
        require('jquery'), 
        require('common'), 
        require('/static/asset/common/js/constant')
    );

    /* AMD module */

} else if (typeof define == 'function' && define.amd) {

    define(["jquery", "common", "constant"], factory);

    /* Browser global */

} else {

    factory(window.jQuery);

}

}(function ($, common, CONSTANT) {

"use strict";
var defaults = {

    root: '',// 请求根路径

    url: "",                // 相对路径

    cache: false,           // 是否使用缓存

    data: {},               // 传递到后台的参数,特殊情况时,也可传入原本由DataTables自行控制的参数,如排序参数sortBy和sortOrder

    dataType: "json",       // 返回数据类型

    type: "GET",            // GET或POST

    lock: true,             // 是否用遮罩锁定页面操作

    lockTarget: "body",     // 遮罩目标,传入元素ID或对象则只遮罩指定对象,默认时遮罩全屏

    success: null,          // 成功处理函数(覆盖默认),若传入该参数,需完整重写ajax的success回调方法

    error: null,            // 失败处理函数(覆盖默认),若传入该参数,需完整重写ajax的error回调方法

    onSuccess: null,        // 请求成功回调(不覆盖)

    onError: null,          // 请求失败回调(不覆盖)

    successMessage: null,   // 操作成功时提示信息

    errorMessage: null      // 操作失败时提示信息

};

/** The constructor */

function RESTAjax(option) {

    this.option = $.extend(option || {}, defaults);

}
function createMessage(message, data) {

    return $.isFunction(message) ? message(data) : message;

}

RESTAjax.fn = RESTAjax.prototype = {

/**

* option : RESTAjax参数,属性的作用参考default对象描述

* 直接调用此方法时参数与JQuery Ajax基本一致,onSuccess和onError无效

* */

ajax: function (option) {

    var self = this;

    return $.Deferred(function (defer) {

        option = $.extend({}, self.option, option);

        if (option.type == "POST") {

            //js对象转换为标准JSON对象后传递给后台,规避array无法被转换等问题

            option.data = JSON.stringify(option.data);

        }

        $.ajax({

            type: option.type,

            url: option.root + option.url,

            cache: option.cache,

            data: option.data,

            beforeSend: function (xhr) {},

            headers: {

                'x-authorization': "Bearer " + localStorage.getItem("token")

            },

            contentType: "application/json; charset=UTF-8"//传递参数类型约定为JSON不可更改

            dataType: option.dataType,

            success: function (data, textStatus, jqXHR) {

                if (data.message) {

                    if (data.success) {//从返回数据中判断返回结果为成功

                        option.success && option.success(data);

                        defer.resolve(data);

                    } else {

                        option.error(data);

                    }

                } else {

                    option.success && option.success(data);

                    defer.resolve(data);

                }

            },

            error: function (XMLHttpRequest, textStatus, errorThrown) {
                var errMsg = "服务器连接异常!";

                switch (XMLHttpRequest.status) {

                    case 404:

                        errMsg = "请求地址不存在!";

                        break;

                    case 500:

                        errMsg = "服务器内部错误!";

                    default:

                        break;

                }
                var data = {

                    "success": false,

                    "errMsg": "(" + XMLHttpRequest.status + ")" + errMsg,

                    "data": {

                        "XMLHttpRequest": XMLHttpRequest,

                        "textStatus": textStatus,

                        "errorThrown": errorThrown

                    }

                };

                if (option.error) {

                    option.error(data);

                    defer.reject(data);

                } else {

                    console.log(JSON.stringify(data));

                }

            }

        });

    }).promise();

},

/**

* 普通查询

* option : RESTAjax参数,属性的作用参考default对象描述

* */

query: function (option) {

    var self = this;

    return $.Deferred(function (defer) {

        self.ajax($.extend({}, self.option, {

            type: "GET",

            success: function (data) {

                option.onSuccess && option.onSuccess(data);

                defer.resolve(data);

            },

            error: function (data) {

                option.onError && option.onError(data);

                defer.reject(data);

            }

        }, option));

    }).promise();

},
/**

* 普通添加

* option : RESTAjax参数,属性的作用参考default对象描述

* */

add: function (option) {

    var self = this;

    return $.Deferred(function (defer) {

        self.ajax($.extend({}, self.option, {

            type: "POST",

            success: function (data) {

                option.onSuccess && option.onSuccess(data);

                defer.resolve(data);

            },

            error: function (data) {

                option.onError && option.onError(data);

                defer.reject(data);

            }

            }, option));

    }).promise();

},

/**

* 普通修改

* option : RESTAjax参数,属性的作用参考default对象描述

* */

update: function (option) {

    var self = this;

    return $.Deferred(function (defer) {

        self.ajax($.extend({}, self.option, {

            type: "POST",

                success: function (data) {
                    option.onSuccess && option.onSuccess(data);

                    defer.resolve(data);

                },

                error: function (data) {

                    option.onError && option.onError(data);

                    defer.reject(data);

                }

            }, option));

    }).promise();

},

/**

* 普通删除

* option : RESTAjax参数,属性的作用参考default对象描述

* */

del: function (option) {

    var self = this;

    return $.Deferred(function (defer) {

        self.ajax($.extend({}, self.option, {

            type: "POST",

            success: function (data) {
                option.onSuccess && option.onSuccess(data);

                defer.resolve(data);

            },

            error: function (data) {


                option.onError && option.onError(data);

                defer.reject(data);

            }

        }, option));

    }).promise();

},

/**

* 普通操作

* option : RESTAjax参数,属性的作用参考default对象描述

* */

action: function (option) {

    var self = this;

    return $.Deferred(function (defer) {

        self.ajax($.extend({}, self.option, {

            success: function (data) {

                option.onSuccess && option.onSuccess(data);

                defer.resolve(data);

            },

            error: function (data) {

                option.onError && option.onError(data);

                defer.reject(data);

            }

        }, option));

    }).promise();

},

custom: function (option) {

        var self = this;

        return $.Deferred(function (defer) {

            self.ajax($.extend({}, self.option, {

                success: function (data) {

                    option.onSuccess && option.onSuccess(data);

                    defer.resolve(data);

                },

                error: function (data) {

                    option.onError && option.onError(data);

                        defer.reject(data);

                    }

                }, option));

            }).promise();

        }

    };
    window.RESTAjax = $.restAjax = new RESTAjax;

    return $;

}));