| /** | 
|  * @Class Request | 
|  * @description luch-request http请求插件 | 
|  * @version 3.0.7 | 
|  * @Author lu-ch | 
|  * @Date 2021-09-04 | 
|  * @Email webwork.s@qq.com | 
|  * 文档: https://www.quanzhan.co/luch-request/ | 
|  * github: https://github.com/lei-mu/luch-request | 
|  * DCloud: http://ext.dcloud.net.cn/plugin?id=392 | 
|  * HBuilderX: beat-3.0.4 alpha-3.0.4 | 
|  */ | 
|   | 
| import dispatchRequest from './dispatchRequest' | 
| import InterceptorManager from './InterceptorManager' | 
| import mergeConfig from './mergeConfig' | 
| import defaults from './defaults' | 
| import { isPlainObject } from '../utils' | 
| import clone from '../utils/clone' | 
|   | 
| export default class Request { | 
|     /** | 
|    * @param {Object} arg - 全局配置 | 
|    * @param {String} arg.baseURL - 全局根路径 | 
|    * @param {Object} arg.header - 全局header | 
|    * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式 | 
|    * @param {String} arg.dataType = [json] - 全局默认的dataType | 
|    * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持 | 
|    * @param {Object} arg.custom - 全局默认的自定义参数 | 
|    * @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序 | 
|    * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+) | 
|    * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+) | 
|    * @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+) | 
|    * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300 | 
|    */ | 
|     constructor(arg = {}) { | 
|         if (!isPlainObject(arg)) { | 
|             arg = {} | 
|             console.warn('设置全局参数必须接收一个Object') | 
|         } | 
|         this.config = clone({ ...defaults, ...arg }) | 
|         this.interceptors = { | 
|             request: new InterceptorManager(), | 
|             response: new InterceptorManager() | 
|         } | 
|     } | 
|   | 
|     /** | 
|    * @Function | 
|    * @param {Request~setConfigCallback} f - 设置全局默认配置 | 
|    */ | 
|     setConfig(f) { | 
|         this.config = f(this.config) | 
|     } | 
|   | 
|     middleware(config) { | 
|         config = mergeConfig(this.config, config) | 
|         const chain = [dispatchRequest, undefined] | 
|         let promise = Promise.resolve(config) | 
|   | 
|         this.interceptors.request.forEach((interceptor) => { | 
|             chain.unshift(interceptor.fulfilled, interceptor.rejected) | 
|         }) | 
|   | 
|         this.interceptors.response.forEach((interceptor) => { | 
|             chain.push(interceptor.fulfilled, interceptor.rejected) | 
|         }) | 
|   | 
|         while (chain.length) { | 
|             promise = promise.then(chain.shift(), chain.shift()) | 
|         } | 
|   | 
|         return promise | 
|     } | 
|   | 
|     /** | 
|    * @Function | 
|    * @param {Object} config - 请求配置项 | 
|    * @prop {String} options.url - 请求路径 | 
|    * @prop {Object} options.data - 请求参数 | 
|    * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型 | 
|    * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse | 
|    * @prop {Object} [options.header = config.header] - 请求header | 
|    * @prop {Object} [options.method = config.method] - 请求方法 | 
|    * @returns {Promise<unknown>} | 
|    */ | 
|     request(config = {}) { | 
|         return this.middleware(config) | 
|     } | 
|   | 
|     get(url, options = {}) { | 
|         return this.middleware({ | 
|             url, | 
|             method: 'GET', | 
|             ...options | 
|         }) | 
|     } | 
|   | 
|     post(url, data, options = {}) { | 
|         return this.middleware({ | 
|             url, | 
|             data, | 
|             method: 'POST', | 
|             ...options | 
|         }) | 
|     } | 
|   | 
|     // #ifndef MP-ALIPAY | 
|     put(url, data, options = {}) { | 
|         return this.middleware({ | 
|             url, | 
|             data, | 
|             method: 'PUT', | 
|             ...options | 
|         }) | 
|     } | 
|   | 
|     // #endif | 
|   | 
|     // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU | 
|     delete(url, data, options = {}) { | 
|         return this.middleware({ | 
|             url, | 
|             data, | 
|             method: 'DELETE', | 
|             ...options | 
|         }) | 
|     } | 
|   | 
|     // #endif | 
|   | 
|     // #ifdef H5 || MP-WEIXIN | 
|     connect(url, data, options = {}) { | 
|         return this.middleware({ | 
|             url, | 
|             data, | 
|             method: 'CONNECT', | 
|             ...options | 
|         }) | 
|     } | 
|   | 
|     // #endif | 
|   | 
|     // #ifdef  H5 || MP-WEIXIN || MP-BAIDU | 
|     head(url, data, options = {}) { | 
|         return this.middleware({ | 
|             url, | 
|             data, | 
|             method: 'HEAD', | 
|             ...options | 
|         }) | 
|     } | 
|   | 
|     // #endif | 
|   | 
|     // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU | 
|     options(url, data, options = {}) { | 
|         return this.middleware({ | 
|             url, | 
|             data, | 
|             method: 'OPTIONS', | 
|             ...options | 
|         }) | 
|     } | 
|   | 
|     // #endif | 
|   | 
|     // #ifdef H5 || MP-WEIXIN | 
|     trace(url, data, options = {}) { | 
|         return this.middleware({ | 
|             url, | 
|             data, | 
|             method: 'TRACE', | 
|             ...options | 
|         }) | 
|     } | 
|   | 
|     // #endif | 
|   | 
|     upload(url, config = {}) { | 
|         config.url = url | 
|         config.method = 'UPLOAD' | 
|         return this.middleware(config) | 
|     } | 
|   | 
|     download(url, config = {}) { | 
|         config.url = url | 
|         config.method = 'DOWNLOAD' | 
|         return this.middleware(config) | 
|     } | 
| } | 
|   | 
| /** | 
|  * setConfig回调 | 
|  * @return {Object} - 返回操作后的config | 
|  * @callback Request~setConfigCallback | 
|  * @param {Object} config - 全局默认config | 
|  */ |