123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640 |
- /* !
- * 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;
- })));
|