472 lines
19 KiB
JavaScript
472 lines
19 KiB
JavaScript
|
|
/*!
|
|||
|
|
* 主 题:API调用方法
|
|||
|
|
* 说 明:用于调用Restful api接口的js方法。
|
|||
|
|
* 功能描述:
|
|||
|
|
* 1、封装api调用方法,采用axios异步读取服务端;支持get,post,delete,put,patch,options六种方式
|
|||
|
|
* 2、数据提交与返回均经过url编码与解码
|
|||
|
|
* 3、一些常用方法,如$api.trim,querystring,cookies等
|
|||
|
|
*
|
|||
|
|
*
|
|||
|
|
* 作 者:宋雷鸣 10522779@qq.com
|
|||
|
|
* 开发时间: 2019年5月20日
|
|||
|
|
*/
|
|||
|
|
(function () {
|
|||
|
|
var config = {
|
|||
|
|
//api的版本号
|
|||
|
|
versions: ["", "1", "2"],
|
|||
|
|
versionDefault: "1", //默认版本号
|
|||
|
|
//调用地址的根路径
|
|||
|
|
baseURL: '',
|
|||
|
|
pathUrl: "/api/v{0}/", //url路径
|
|||
|
|
};
|
|||
|
|
//版权信息
|
|||
|
|
var copyright = {};
|
|||
|
|
//一些常用方法
|
|||
|
|
var methods = {
|
|||
|
|
//生成axios调用的路径,
|
|||
|
|
//vesion:api版本号,
|
|||
|
|
//way:api方法名,如/api/v1/[account/del]
|
|||
|
|
url: function (version, way) {
|
|||
|
|
if (way === undefined) throw 'api名称不得为空';
|
|||
|
|
var url = config.pathUrl.replace("{0}", version);
|
|||
|
|
//调用地址的根路径可以在此处理,(如果需要跨多台服务器请求的话)
|
|||
|
|
if (config.baseURL != '') url = config.baseURL + url;
|
|||
|
|
return url + way;
|
|||
|
|
},
|
|||
|
|
//获取url中的参数
|
|||
|
|
querystring: function (url, key) {
|
|||
|
|
if (arguments.length == 1) key = arguments[0];
|
|||
|
|
if (arguments.length <= 1) url = String(window.document.location.href);
|
|||
|
|
if (url.indexOf("?") < 0) return "";
|
|||
|
|
//取所有参数
|
|||
|
|
var values = new Array();
|
|||
|
|
var query = url.substring(url.lastIndexOf("?") + 1).split('&');
|
|||
|
|
for (var q in query) {
|
|||
|
|
var arr = query[q].split('=');
|
|||
|
|
if (arr.length < 2) continue;
|
|||
|
|
if (arr[1].indexOf("#") > -1) arr[1] = arr[1].substring(0, arr[1].indexOf("#"));
|
|||
|
|
arr[1] = decodeURI(arr[1]).replace(/<[^>]+>/g, "");
|
|||
|
|
values.push({
|
|||
|
|
key: arr[0],
|
|||
|
|
val: arr[1]
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
//返回
|
|||
|
|
if (arguments.length == 0) return values;
|
|||
|
|
if (arguments.length == 1) {
|
|||
|
|
for (var q in values) {
|
|||
|
|
if (values[q].key.toLowerCase() == key.toLowerCase())
|
|||
|
|
return values[q].val;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return "";
|
|||
|
|
},
|
|||
|
|
setpara: function (key, value) {
|
|||
|
|
//获取所有参数
|
|||
|
|
var values = methods.querystring();
|
|||
|
|
var isExist = false;
|
|||
|
|
for (var q in values) {
|
|||
|
|
if (values[q].key.toLowerCase() == key.toLowerCase()) {
|
|||
|
|
values[q].val = value;
|
|||
|
|
isExist = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!isExist) values.push({
|
|||
|
|
key: key,
|
|||
|
|
val: value
|
|||
|
|
});
|
|||
|
|
//拼接Url
|
|||
|
|
var url = String(window.document.location.href);
|
|||
|
|
if (url.indexOf("?") > -1) url = url.substring(0, url.lastIndexOf("?"));
|
|||
|
|
var parastr = "";
|
|||
|
|
for (var i = 0; i < values.length; i++) {
|
|||
|
|
parastr += values[i].key + "=" + values[i].val;
|
|||
|
|
if (i < values.length - 1) parastr += "&";
|
|||
|
|
}
|
|||
|
|
return url + "?" + parastr;
|
|||
|
|
},
|
|||
|
|
//去除两端空格
|
|||
|
|
trim: function (str) {
|
|||
|
|
return str.replace(/^\s*|\s*$/g, '').replace(/^\n+|\n+$/g, "");
|
|||
|
|
},
|
|||
|
|
//将数据url解码
|
|||
|
|
unescape: function (data) {
|
|||
|
|
var typeName = methods.getType(data);
|
|||
|
|
if (typeName == 'String') return unescape(data);
|
|||
|
|
if (typeName == 'Object') return handleObject(data);
|
|||
|
|
if (typeName == 'Array') return handleArray(data);
|
|||
|
|
//反常时间的处理,如果时间处于一百年前,则返回空值
|
|||
|
|
function abnormalTime(date) {
|
|||
|
|
var now = new Date();
|
|||
|
|
var y = now.getFullYear();
|
|||
|
|
var m = now.getMonth();
|
|||
|
|
var d = now.getDate();
|
|||
|
|
now = new Date(y - 100, m < 10 ? '0' + m : m, d < 10 ? ('0' + d) : d);
|
|||
|
|
if (date > now) return date;
|
|||
|
|
return '';
|
|||
|
|
}
|
|||
|
|
//解码对象
|
|||
|
|
function handleObject(data) {
|
|||
|
|
for (var key in data) {
|
|||
|
|
var typeName = methods.getType(data[key]);
|
|||
|
|
if (typeName == 'String')
|
|||
|
|
data[key] = unescape(data[key]);
|
|||
|
|
if (typeName == 'Date')
|
|||
|
|
data[key] = abnormalTime(data[key]);
|
|||
|
|
if (typeName == 'Array')
|
|||
|
|
data[key] = handleArray(data[key]);
|
|||
|
|
if (typeName == 'Object')
|
|||
|
|
data[key] = handleObject(data[key]);
|
|||
|
|
}
|
|||
|
|
return data;
|
|||
|
|
}
|
|||
|
|
//解码数组
|
|||
|
|
function handleArray(data) {
|
|||
|
|
for (var d in data) {
|
|||
|
|
data[d] = handleObject(data[d]);
|
|||
|
|
}
|
|||
|
|
return data;
|
|||
|
|
}
|
|||
|
|
return data;
|
|||
|
|
},
|
|||
|
|
//判断数据类型
|
|||
|
|
getType: function (data) {
|
|||
|
|
var getType = Object.prototype.toString;
|
|||
|
|
var myType = getType.call(data); //调用call方法判断类型,结果返回形如[object Function]
|
|||
|
|
var typeName = myType.slice(8, -1); //[object Function],即取除了“[object ”的字符串。
|
|||
|
|
return typeName;
|
|||
|
|
},
|
|||
|
|
//storage存储
|
|||
|
|
storage: function (key, value) {
|
|||
|
|
var isAndroid = (/android/gi).test(navigator.appVersion);
|
|||
|
|
var uzStorage = function () {
|
|||
|
|
var ls = window.localStorage;
|
|||
|
|
if (isAndroid) ls = window.localStorage;
|
|||
|
|
return ls;
|
|||
|
|
};
|
|||
|
|
//如果只有一个参数,为读取
|
|||
|
|
if (arguments.length === 1) {
|
|||
|
|
var ls = uzStorage();
|
|||
|
|
if (ls) {
|
|||
|
|
var v = ls.getItem(key);
|
|||
|
|
if (!v) return;
|
|||
|
|
if (v.indexOf('obj-') === 0) {
|
|||
|
|
v = v.slice(4);
|
|||
|
|
return JSON.parse(v);
|
|||
|
|
} else if (v.indexOf('str-') === 0) {
|
|||
|
|
return v.slice(4);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//如果两个参数,为写入,第一个为键,第二个为值
|
|||
|
|
if (arguments.length === 2) {
|
|||
|
|
if (value != null) {
|
|||
|
|
var v = typeof value == 'object' ? 'obj-' + JSON.stringify(value) : 'str-' + value;
|
|||
|
|
var ls = uzStorage();
|
|||
|
|
if (ls) ls.setItem(key, v);
|
|||
|
|
} else {
|
|||
|
|
var ls = uzStorage();
|
|||
|
|
if (ls && key) {
|
|||
|
|
ls.removeItem(key);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
cookie: function (name, value, options) {
|
|||
|
|
if (typeof value != 'undefined') { // name and value given, set cookie
|
|||
|
|
options = options || {};
|
|||
|
|
if (value === null) {
|
|||
|
|
value = '';
|
|||
|
|
options.expires = -1;
|
|||
|
|
}
|
|||
|
|
var expires = '';
|
|||
|
|
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
|
|||
|
|
var date;
|
|||
|
|
if (typeof options.expires == 'number') {
|
|||
|
|
date = new Date();
|
|||
|
|
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
|
|||
|
|
} else {
|
|||
|
|
date = options.expires;
|
|||
|
|
}
|
|||
|
|
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
|
|||
|
|
}
|
|||
|
|
var path = options.path ? '; path=' + options.path : '; path=/';
|
|||
|
|
var domain = options.domain ? '; domain=' + options.domain : '';
|
|||
|
|
var secure = options.secure ? '; secure' : '';
|
|||
|
|
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
|
|||
|
|
} else { // only name given, get cookie
|
|||
|
|
var cookieValue = null;
|
|||
|
|
if (document.cookie && document.cookie != '') {
|
|||
|
|
var cookies = document.cookie.split(';');
|
|||
|
|
for (var i = 0; i < cookies.length; i++) {
|
|||
|
|
var cookie = methods.trim(cookies[i]);
|
|||
|
|
// Does this cookie string begin with the name we want?
|
|||
|
|
if (cookie.substring(0, name.length + 1) == (name + '=')) {
|
|||
|
|
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return cookieValue;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//记录或获取登录状态值
|
|||
|
|
loginstatus: function (key, code) {
|
|||
|
|
var storagename = 'weishakei_loginstatus';
|
|||
|
|
var status = methods.storage(storagename);
|
|||
|
|
//读取
|
|||
|
|
if (arguments.length <= 1) {
|
|||
|
|
if (status == null || !(status instanceof Array)) return '';
|
|||
|
|
var str = '';
|
|||
|
|
if (arguments.length == 0) {
|
|||
|
|
|
|||
|
|
for (var i = 0; i < status.length; i++) {
|
|||
|
|
if (!!status[i].val) str += status[i].val;
|
|||
|
|
if (i < status.length - 1) str += ',';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (arguments.length == 1) {
|
|||
|
|
for (var t in status) {
|
|||
|
|
if (!!status[t].key && status[t].key == key)
|
|||
|
|
str = status[t].val;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return str;
|
|||
|
|
}
|
|||
|
|
//写入
|
|||
|
|
if (arguments.length == 2) {
|
|||
|
|
if (status == null || !(status instanceof Array)) status = [];
|
|||
|
|
var isexist = false;
|
|||
|
|
for (var t in status) {
|
|||
|
|
if (!!status[t].key && status[t].key == key) {
|
|||
|
|
status[t].val = code;
|
|||
|
|
isexist = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!isexist) status.push({
|
|||
|
|
key: key,
|
|||
|
|
val: code
|
|||
|
|
});
|
|||
|
|
methods.storage(storagename, status);
|
|||
|
|
return status;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//判断变量是否是对象
|
|||
|
|
isobj: function (obj) {
|
|||
|
|
return Object.prototype.toString.call(obj) === '[object Object]';
|
|||
|
|
},
|
|||
|
|
//在线浏览pdf文件
|
|||
|
|
pdfViewer: function (file) {
|
|||
|
|
var viewer = "/Utility/PdfViewer/viewer.html";
|
|||
|
|
if (file.indexOf("?") > -1) file = file.substring(0, file.indexOf("?"));
|
|||
|
|
viewer += "?file=" + encodeURIComponent(file);
|
|||
|
|
//window.location.href = viewer;
|
|||
|
|
return viewer;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
//api操作的具体对象和方法
|
|||
|
|
var apiObj = function (version) {
|
|||
|
|
//加载效果,参数:前者为一般loading效果,后者一般为去除loading
|
|||
|
|
this.effect = function (loading, loaded) {
|
|||
|
|
this.loadeffect.before = loading;
|
|||
|
|
this.loadeffect.after = loaded;
|
|||
|
|
return this;
|
|||
|
|
}
|
|||
|
|
this.loadeffect = {
|
|||
|
|
before: null,
|
|||
|
|
after: null
|
|||
|
|
};
|
|||
|
|
//当前api要请求的服务端接口的版本号
|
|||
|
|
this.version = version == null ? config.versionDefault : version;
|
|||
|
|
var httpverb = ['get', 'post', 'delete', 'put', 'patch', 'options'];
|
|||
|
|
for (var i = 0; i < httpverb.length; i++) {
|
|||
|
|
var el = httpverb[i];
|
|||
|
|
var tm = "this." + el + " = function (way, parameters,loading,loaded) {return this.query(way, parameters, '" + el + "',loading,loaded,'json');}";
|
|||
|
|
eval(tm);
|
|||
|
|
}
|
|||
|
|
var self = this;
|
|||
|
|
//创建请求对象,以及拦截器
|
|||
|
|
//way:接口方法
|
|||
|
|
//returntype:返回数据的类型,Json或xml
|
|||
|
|
this.query = function (way, parameters, method, loading, loaded, returntype) {
|
|||
|
|
var url = methods.url(this.version, way);
|
|||
|
|
if (arguments.length < 2 || parameters == null) parameters = {};
|
|||
|
|
if (arguments.length < 3 || method == null || method == '') method = 'get';
|
|||
|
|
//开始时间
|
|||
|
|
var startTime = new Date();
|
|||
|
|
//console.log(startTime);
|
|||
|
|
//创建axiso对象
|
|||
|
|
var instance = axios.create({
|
|||
|
|
method: method != 'get' ? 'post' : 'get',
|
|||
|
|
url: url,
|
|||
|
|
headers: {
|
|||
|
|
'X-Custom-Header': 'weishakeji',
|
|||
|
|
'Access-Control-Allow-Headers': 'X-Requested-With',
|
|||
|
|
'content-type': 'application/x-www-form-urlencoded',
|
|||
|
|
'Access-Control-Allow-Methods': 'POST,GET,DELETE,PUT,PATCH,HEAD,OPTIONS'
|
|||
|
|
},
|
|||
|
|
auth: {
|
|||
|
|
username: 'weishakeji ' + method + ' ' + returntype + ' ' + window.location,
|
|||
|
|
password: methods.loginstatus()
|
|||
|
|
},
|
|||
|
|
timeout: 60 * 1000,
|
|||
|
|
returntype: returntype
|
|||
|
|
});
|
|||
|
|
//添加请求拦截器(即请求之前)
|
|||
|
|
instance.interceptors.request.use(function (config) {
|
|||
|
|
if (loading == null) loading = self.loadeffect.before;
|
|||
|
|
if (loading != null) loading(config);
|
|||
|
|
//在发送请求之前做某件事
|
|||
|
|
if (config.method != 'get') {
|
|||
|
|
var formData = new FormData();
|
|||
|
|
for (var d in config.data) {
|
|||
|
|
var typeName = methods.getType(config.data[d]);
|
|||
|
|
if (typeName == 'Date') {
|
|||
|
|
formData.append(d, config.data[d].getTime());
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
//json值,序列化为字符串
|
|||
|
|
if (typeName === 'Object') {
|
|||
|
|
formData.append(d,escape(JSON.stringify(config.data[d])));
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
formData.append(d, escape(config.data[d]));
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
config.data = formData;
|
|||
|
|
} else {
|
|||
|
|
//克隆参数对象,因为上传的参数要escape转码,需要保留原数据类型
|
|||
|
|
var tmpObj = new Object();
|
|||
|
|
for (var d in config.params) {
|
|||
|
|
var typeName = methods.getType(config.params[d]);
|
|||
|
|
if (typeName == 'Date') {
|
|||
|
|
tmpObj[d] = config.params[d].getTime();
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
//json值,序列化为字符串
|
|||
|
|
if (typeName === 'Object') {
|
|||
|
|
tmpObj[d] = escape(JSON.stringify(config.params[d]));
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
tmpObj[d] = escape(config.params[d]);
|
|||
|
|
}
|
|||
|
|
config.params = tmpObj;
|
|||
|
|
}
|
|||
|
|
return config;
|
|||
|
|
}, function (error) {
|
|||
|
|
console.log('错误的传参');
|
|||
|
|
if (loaded == null) loaded = self.loadeffect.after;
|
|||
|
|
if (loading != null) loaded(config, error);
|
|||
|
|
//return Promise.reject(error);
|
|||
|
|
});
|
|||
|
|
//添加响应拦截器(即返回之后)
|
|||
|
|
instance.interceptors.response.use(function (response) {
|
|||
|
|
response.text = response.data;
|
|||
|
|
//如果返回的数据是字符串,这里转为json
|
|||
|
|
if (response.config.returntype == "json") {
|
|||
|
|
if (typeof (response.data) == 'string') {
|
|||
|
|
response.data = eval("(" + response.data + ")");
|
|||
|
|
}
|
|||
|
|
//处理数据,服务器端返回的数据是经过Url编码的,此处进行解码
|
|||
|
|
response.data = methods.unescape(response.data);
|
|||
|
|
if (response.data.result != null) {
|
|||
|
|
if (typeof (response.data.result) == 'string') {
|
|||
|
|
try {
|
|||
|
|
response.data.result = eval("(" + response.data.result + ")");
|
|||
|
|
} catch (err) {
|
|||
|
|
//alert(err);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//计算执行耗时
|
|||
|
|
if (response.data) {
|
|||
|
|
response.data['webspan'] = new Date() - startTime;
|
|||
|
|
}
|
|||
|
|
//执行加载完成后的方法
|
|||
|
|
if (loaded == null) loaded = self.loadeffect.after;
|
|||
|
|
if (loaded != null) loaded(response, null);
|
|||
|
|
return response;
|
|||
|
|
}, function (error) {
|
|||
|
|
if (loaded == null) loaded = self.loadeffect.after;
|
|||
|
|
if (loaded != null) loaded(null, error);
|
|||
|
|
//return Promise.reject(error);
|
|||
|
|
});
|
|||
|
|
//如果是get方式,参数名是params;非get参数名是data
|
|||
|
|
if (method == 'get') {
|
|||
|
|
return instance.request({
|
|||
|
|
params: parameters
|
|||
|
|
});
|
|||
|
|
} else {
|
|||
|
|
return instance.request({
|
|||
|
|
data: parameters
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//一次获取多个数据
|
|||
|
|
this.bat = function (queryArr) {
|
|||
|
|
if (arguments.length == 0) return null;
|
|||
|
|
if (arguments.length == 1) return queryArr;
|
|||
|
|
return axios.all(arguments);
|
|||
|
|
}
|
|||
|
|
//常用方法加到$api根,方便调用
|
|||
|
|
for (var m in methods) {
|
|||
|
|
eval("this." + m + "=" + methods[m] + ";");
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
//创建$api调用对象
|
|||
|
|
for (var v in config.versions) {
|
|||
|
|
var str = config.versions[v] == "" ?
|
|||
|
|
"window.$api = new apiObj();" :
|
|||
|
|
"window.$api.v" + config.versions[v] + "= new apiObj('" + config.versions[v] + "')";
|
|||
|
|
eval(str);
|
|||
|
|
}
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
//异步获取数据的示例
|
|||
|
|
//$api.get("/dd/xx");
|
|||
|
|
/* $api.v1.post("/dd/xx",{id:1}).then(function(req){
|
|||
|
|
.....
|
|||
|
|
});*/
|
|||
|
|
|
|||
|
|
/*一次获取多个数据
|
|||
|
|
$api.bat(
|
|||
|
|
$api.get("Outline/tree", { couid: $api.querystring("couid") }),
|
|||
|
|
$api.get("Course/ForID", { id: $api.querystring("couid") })
|
|||
|
|
).then(axios.spread(function (req, cur) {
|
|||
|
|
if (req.data.success) {
|
|||
|
|
var outlines = req.data.result;
|
|||
|
|
}
|
|||
|
|
}));
|
|||
|
|
*/
|
|||
|
|
//日期格式化
|
|||
|
|
Date.prototype.format = function (fmt) {
|
|||
|
|
var o = {
|
|||
|
|
"M+": this.getMonth() + 1,
|
|||
|
|
"d+": this.getDate(),
|
|||
|
|
"h+": this.getHours()
|
|||
|
|
};
|
|||
|
|
if (/(y+)/.test(fmt))
|
|||
|
|
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
|
|||
|
|
for (var k in o)
|
|||
|
|
if (new RegExp("(" + k + ")").test(fmt))
|
|||
|
|
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
|
|||
|
|
|
|||
|
|
return fmt;
|
|||
|
|
}
|
|||
|
|
//添加加载前后的事件
|
|||
|
|
$api.effect(function () {
|
|||
|
|
|
|||
|
|
}, function (response, err) {
|
|||
|
|
//请求网址
|
|||
|
|
var url = response.config.url;
|
|||
|
|
url = url.substring(url.indexOf('/v1/') + 3);
|
|||
|
|
//请求参数
|
|||
|
|
var para = JSON.stringify(response.config.params);
|
|||
|
|
para = para == undefined ? '' : para;
|
|||
|
|
//时长
|
|||
|
|
var exec = response.data.execspan;
|
|||
|
|
var span = response.data.webspan;
|
|||
|
|
console.log(url + '' + para + ' 用时 ' + span + ' 毫秒,服务端 ' + exec + ' 毫秒');
|
|||
|
|
//console.log(response);
|
|||
|
|
});
|