glhcp/uniapp/js_sdk/xtshadow-axios/axios.js

641 lines
19 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/* !
* uni-axios-ts
* library v0.0.4
* github address https://gitee.com/codeweb/uni-axios-ts.git
*
* (c) 2019.12 xtshadow
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = global || self, global.axios = factory());
}(this, (function () { 'use strict';
/**
* 请求Method类型
*/
var Method;
(function (Method) {
Method["GET"] = "GET";
Method["POST"] = "POST";
Method["PUT"] = "PUT";
Method["HEAD"] = "HEAD";
Method["DELETE"] = "DELETE";
Method["TRACE"] = "TRACE";
Method["CONNECT"] = "CONNECT";
Method["OPTIONS"] = "OPTIONS";
})(Method || (Method = {}));
/**
* 响应的数据类型
*/
var HttpResponseType;
(function (HttpResponseType) {
HttpResponseType["TEXT"] = "text";
HttpResponseType["ARRAYBUFFER"] = "arraybuffer";
})(HttpResponseType || (HttpResponseType = {}));
var AxiosError =
/*@__PURE__*/
function (Error) {
function AxiosError(message, statusCode, config, request, response) {
Error.call(this, message);
this.config = config;
this.statusCode = statusCode;
this.request = request;
this.response = response;
Object.setPrototypeOf(this, AxiosError.prototype);
}
if (Error) AxiosError.__proto__ = Error;
AxiosError.prototype = Object.create(Error && Error.prototype);
AxiosError.prototype.constructor = AxiosError;
return AxiosError;
}(Error);
function createError(message, statusCode, config, request, response) {
var error = new AxiosError(message, statusCode, config, request, response);
return error;
}
/**
* 执行请求,调用微信Request方法
* @param config
*/
function wxRequest(config) {
var url = config.url;
var method = config.method;
if (method === void 0) method = Method.GET;
var data = config.data;
if (data === void 0) data = {};
var header = config.header;
if (header === void 0) header = {};
var responseType = config.responseType;
if (responseType === void 0) responseType = HttpResponseType.TEXT;
var cancelToken = config.cancelToken;
var validateStatus = config.validateStatus;
return new Promise(function (resolve, reject) {
// @ts-ignore
var requestTask = uni.request({
url: url,
header: header,
method: method,
data: data,
responseType: responseType,
success: function success(res) {
var response = {
data: res.data,
statusCode: res.statusCode,
header: res.header
};
if (!validateStatus || validateStatus(res.statusCode)) {
resolve(response);
} else {
reject(createError("Request failed with status code " + response.statusCode, response.statusCode, config, requestTask, response));
}
},
fail: function fail(error) {
reject(createError("Net Error", 1001, config, requestTask));
}
}); // 请求取消
if (cancelToken) {
cancelToken.promise.then(function (reason) {
requestTask.abort();
reject(reason);
});
}
});
}
function _typeof(obj) {
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
_typeof = function (obj) {
return typeof obj;
};
} else {
_typeof = function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};
}
return _typeof(obj);
}
var toString = Object.prototype.toString;
/**
* Determine if a value is an Array
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an Array, otherwise false
*/
function isArray(val) {
return toString.call(val) === '[object Array]';
}
/**
* 确定值是否为对象
*
* @param {Object} val 要测试的值
* @returns {boolean} 如果值是对象则为true否则为false
*/
function isObject(val) {
return val !== null && _typeof(val) === 'object';
}
/**
* 迭代Array或为每个项目调用函数的对象。
*
* 如果`obj`为数组回调将被调用传递。
* 每项的值、索引和完整数组。
*
* 如果`obj`是一个对象回调将被调用传递。
* 每个属性的值、键和Complete对象。
*
* @param{object|Array} obj要迭代的对象。
* @param{function} fn要为每个项调用的回调。
*/
function forEach(obj, fn) {
if (obj !== null && typeof obj !== 'undefined') {
// Force an array if not already something iterable
// 数组也属于对象
if (_typeof(obj) !== 'object') {
/*eslint no-param-reassign:0*/
obj = [obj];
}
if (isArray(obj)) {
// Iterate over array values
for (var i = 0, l = obj.length; i < l; i++) {
fn.call(null, obj[i], i, obj);
}
} else {
// Iterate over object keys
Object.getOwnPropertyNames(obj).forEach(function (key) {
if (Object.prototype.hasOwnProperty.call(obj, key) && key !== 'constructor') {
fn.call(null, obj[key], key, obj);
}
}); // for (let key in obj) {
// console.log(`forin key:${key}`);
// if (Object.prototype.hasOwnProperty.call(obj, key)) {
// console.log(`callback:${key}`)
// fn.call(null, obj[key], key, obj);
// }
// }
}
}
}
/**
* 通过可变地向`对象A`添加`对象B`的属性来扩展`对象A`
*
* @param {Object} a 要扩展的对象
* @param {Object} b 要从中复制属性的对象
* @param {Object} thisArg 要将函数绑定到的对象
* @return {Object} 对象a的结果
*/
function extend(a, b, thisArg) {
forEach(b, function assignValue(val, key) {
if (thisArg && typeof val === 'function') {
// a[key] = bind(val, thisArg);
a[key] = val.bind(thisArg);
} else {
a[key] = val;
}
});
return a;
}
/**
* 函数等于merge差值为无引用
* 保留为原始对象
* @see merge
* @param {Object} obj1 Object to merge
* @returns {Object} Result of all merge properties
*/
function deepMerge() {
var objs = [],
len = arguments.length;
while (len--) {
objs[len] = arguments[len];
}
var result = Object.create(null);
function assignValue(val, key) {
if (isObject(result[key] && isObject(val))) {
result[key] = deepMerge(result[key], val);
} else if (isObject(val)) {
result[key] = deepMerge({}, val);
} else {
result[key] = val;
}
}
for (var i = 0; i < objs.length; i++) {
var obj = objs[i];
for (var key in obj) {
assignValue(obj[key], key);
}
}
return result;
}
/**
* 标准格式化请求头
* @param headers 请求头对象
* @param normalizeName 标准名称
*/
function normalizeHeaderName(header, normalizeName) {
Object.keys(header).forEach(function (name) {
if (name !== normalizeName && name.toUpperCase() === normalizeName.toUpperCase()) {
header[normalizeName] = header[name];
delete header[name];
}
});
}
/**
* 格式化加工 Header请求头
* @param headers
*/
function processHeaders(header) {
normalizeHeaderName(header, 'Content-Type');
normalizeHeaderName(header, 'appId');
normalizeHeaderName(header, 'sessionId');
return header;
}
/**
* 请求头扁平化
*
* @param headers
* @param method
*/
function flattenHeaders(headers, method) {
if (!headers) {
return headers;
}
headers = deepMerge(headers.common || {}, headers[method.toLocaleLowerCase()] || {}, headers);
var methodsToDelete = ['delete', 'get', 'head', 'options', 'post', 'put', 'patch', 'common'];
methodsToDelete.forEach(function (method) {
delete headers[method];
});
return headers;
}
/**
* 组合URL
* @param baseURL
* @param relativeUrl
*/
function combineURL(baseURL, relativeURL) {
return relativeURL ? baseURL.replace(/\/+$/, "") + "/" + relativeURL.replace(/^\/+/, "") : baseURL;
}
/**
* 判断`URL`是否是绝对路径
* @param url
* @return {boolean}
*/
function isAbsoluteURL(url) {
// 如果URL以“<scheme>//”或“//”协议相对URL开头则该URL被视为绝对值。
// RFC 3986将方案名称定义为以字母开头的字符序列
// 后跟字母,数字,加号,句点或连字符的任意组合。
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
}
/**
* 处理请求头
* @param config
*/
function transformHeaders(config) {
var header = config.header;
if (header === void 0) header = {};
var method = config.method;
if (method === void 0) method = Method.GET;
header = processHeaders(header);
return flattenHeaders(header, method);
}
/**
* 处理请求地址 URL
* @param config
*/
function transformUrl(config) {
var url = config.url;
if (url === void 0) url = '';
var baseURL = config.baseURL;
if (baseURL === void 0) baseURL = '';
if (baseURL && !isAbsoluteURL(url)) {
url = combineURL(baseURL, url);
}
return url;
}
/**
* 抛出异常
*
* 如果当前`cancelToken`已经取消请求,则抛出异常
* @param config
*/
function throwIfCancellationRequested(config) {
if (config.cancelToken) {
config.cancelToken.throwIfRequested();
}
}
/**
* 预处理配置文件
* @param config 配置文件
*/
function processConfig(config) {
config.header = transformHeaders(config);
config.url = transformUrl(config);
}
/**
* 执行请求
* @param config 配置文件
*/
function dispatchRequest(config) {
throwIfCancellationRequested(config);
processConfig(config);
return wxRequest(config);
}
var InterceptorManager = function InterceptorManager() {
this.handlers = [];
};
InterceptorManager.prototype.use = function use(resolved, rejected) {
this.handlers.push({
resolved: resolved,
rejected: rejected
});
return this.handlers.length - 1;
};
InterceptorManager.prototype.eject = function eject(id) {
if (this.handlers[id]) {
this.handlers[id] = null;
}
};
InterceptorManager.prototype.forEach = function forEach(fn) {
this.handlers.forEach(function (interceptor) {
if (interceptor !== null) {
fn(interceptor);
}
});
};
function mergeConfig(defaultConfig, userConfig) {
var config = Object.create(null); // 创建空对象,作为最终的合并结果
// 1.常规属性,如果用户配置了就用用户配置的,如果用户没配置,则用默认配置的;
var defaultToUserConfig = ["baseURL", "transformRequest", "transformResponse", "paramsSerializer", "timeout", "withCredentials", "adapter", "responseType", "xsrfCookieName", "xsrfHeaderName", "onUploadProgress", "onDownloadProgress", "maxContentLength", "validateStatus", "maxRedirects", "httpAgent", "httpsAgent", "cancelToken", "socketPath"];
defaultToUserConfig.forEach(function (prop) {
userConfig = userConfig || {}; // 如果用户配置里有
if (typeof userConfig[prop] !== "undefined") {
// 则用用户配置里的
config[prop] = userConfig[prop]; // 如果用户配置里没有,默认配置里有
} else if (typeof defaultConfig[prop] !== "undefined") {
// 则用默认配置里的
config[prop] = defaultConfig[prop];
}
}); // 2.只接受用户配置,不管默认配置对象里面有没有,我们只取用户配置的;
var valueFromUserConfig = ["url", "method", "params", "data"];
valueFromUserConfig.forEach(function (prop) {
userConfig = userConfig || {};
if (typeof userConfig[prop] !== 'undefined') {
config[prop] = userConfig[prop];
}
}); // 3.复杂对象深度合并
var mergeDeepProperties = ["header", "auth", "proxy"];
mergeDeepProperties.forEach(function (prop) {
userConfig = userConfig || {};
if (isObject(userConfig[prop])) {
config[prop] = deepMerge(defaultConfig[prop], userConfig[prop]);
} else if (typeof userConfig[prop] !== 'undefined') {
config[prop] = userConfig[prop];
} else if (isObject(defaultConfig[prop])) {
config[prop] = deepMerge(defaultConfig[prop]);
} else if (typeof defaultConfig[prop] !== 'undefined') {
config[prop] = defaultConfig[prop];
}
});
return config;
}
var Axios = function Axios(defaultConfig) {
this.defaults = defaultConfig;
this.interceptors = {
request: new InterceptorManager(),
response: new InterceptorManager()
};
};
Axios.prototype.request = function request(config) {
// 合并参数
config = mergeConfig(this.defaults, config); // 拦截器
var promise = Promise.resolve(config);
var chain = [{
resolved: dispatchRequest,
rejected: undefined
}]; // let chain:AxiosInterceptor<any>[] = [
// {
// resolved: dispatchRequest,
// rejected: undefined
// }
// ];
this.interceptors.request.forEach(function (interceptor) {
chain.unshift(interceptor);
});
this.interceptors.response.forEach(function (interceptor) {
chain.push(interceptor);
});
while (chain.length > 0) {
var ref = chain.shift();
var resolved = ref.resolved;
var rejected = ref.rejected;
promise = promise.then(resolved, rejected);
}
return promise; // return dispatchRequest(config);
};
Axios.prototype.get = function get(url, config) {
return this._requestMethodWithoutData(Method.GET, url, config);
};
Axios.prototype.post = function post(url, data, config) {
return this._requestMethodWithData(Method.POST, url, data, config);
};
Axios.prototype.put = function put(url, data, config) {
return this._requestMethodWithData(Method.PUT, url, data, config);
};
Axios.prototype["delete"] = function delete$1(url, config) {
return this._requestMethodWithoutData(Method.DELETE, url, config);
};
Axios.prototype.connect = function connect(url, config) {
return this._requestMethodWithoutData(Method.CONNECT, url, config);
};
Axios.prototype.head = function head(url, config) {
return this._requestMethodWithoutData(Method.HEAD, url, config);
};
Axios.prototype.options = function options(url, config) {
return this._requestMethodWithoutData(Method.OPTIONS, url, config);
};
Axios.prototype.trace = function trace(url, config) {
return this._requestMethodWithoutData(Method.TRACE, url, config);
};
Axios.prototype._requestMethodWithData = function _requestMethodWithData(method, url, data, config) {
return this.request(Object.assign(config || {}, {
method: method,
url: url,
data: data
}));
};
Axios.prototype._requestMethodWithoutData = function _requestMethodWithoutData(method, url, config) {
return this.request(Object.assign(config || {}, {
method: method,
url: url
}));
};
/**
* 根据传入的请求配置对象返回一个请求的`URL`
* @param config 请求配置
* @returns {string} 请求`URL`
*/
Axios.prototype.getUri = function getUri(config) {
config = mergeConfig(this.defaults, config);
return transformUrl(config);
};
/**
* 默认配置
*/
var defaults = {
baseURL: '',
header: {},
method: Method.GET,
responseType: HttpResponseType.TEXT,
validateStatus: function validateStatus(status) {
return status >= 200 && status < 300;
}
};
var Cancel = function Cancel(message) {
if (message === void 0) message = '';
this.message = message;
};
var CancelToken = function CancelToken(executor) {
var this$1 = this;
var resolvePromise;
this.promise = new Promise(function (resolve) {
resolvePromise = resolve;
}); // executor 括号内为 一个回调函数作为参数该函数接收一个string类型的取消原因作为参数
// 调用该回调函数时,会修改 Promise状态为 resolve
executor(function (message) {
if (this$1.reason) {
return;
}
this$1.reason = new Cancel(message);
resolvePromise(this$1.reason); // 修改 Promise状态为 resolve
});
};
CancelToken.source = function source() {
var cancel;
var token = new CancelToken(function (fn) {
cancel = fn;
});
return {
cancel: cancel,
token: token
};
};
CancelToken.prototype.throwIfRequested = function throwIfRequested() {
if (this.reason) {
throw this.reason;
}
};
function isCancel(val) {
return val instanceof Cancel;
}
function getAxios(config) {
var context = new Axios(config); // Axios 实例,用于给 axios继承自身属性
var axios = Axios.prototype.request.bind(context); // 复制原型方法,并绑定函数`this` Copy axios.prototype to instance
extend(axios, Axios.prototype, context); // 复制实例属性 Copy context to instance
extend(axios, context);
return axios;
}
var axios = getAxios(defaults);
axios.create = function create(config) {
return getAxios(mergeConfig(defaults, config));
};
axios.CancelToken = CancelToken;
axios.Cancel = Cancel;
axios.isCancel = isCancel;
axios.all = function (promises) {
return Promise.all(promises);
};
axios.spread = function (callback) {
return function wrap(arr) {
return callback.apply(null, arr);
};
};
return axios;
})));