123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- export default function ({ baseURL, timeout, header }) {
- return {
- get(url, data) { return this.request('GET', url, data) },
- post(url, data) { return this.request('POST', url, data) },
- put(url, data) { return this.request('PUT', url, data) },
- delete(url, data) { return this.request('DELETE', url, data) },
- connect(url, data) { return this.request('CONNECT', url, data) },
- head(url, data) { return this.request('HEAD', url, data) },
- options(url, data) { return this.request('OPTIONS', url, data) },
- reace(url, data) { return this.request('TRACE', url, data) },
- uploadFile(url, data) { return this.file('uploadFile', url, data || {}) },
- downloadFile(url, data) { return this.file('downloadFile', url, data || {}) },
- onerror: [],
- file(method, url, data) {
- let timer, requestTask, aborted = false, abort = () => {
- aborted = true
- requestTask ? requestTask.abort() : ''
- }, progressUpdateHandle, onProgressUpdate = e => progressUpdateHandle = e
- return new Proxy(new Promise((resolve, reject) => {
- this.interceptors.request.intercept({ header: data.header || {}, body: data.formData || {} }, method, url, data).then(async ({ header, body }) => {
- if (aborted) {
- await this.onerror(method, url, data, '网络请求失败:主动取消')
- return reject('网络请求失败:主动取消')
- }
- requestTask = uni[method]({
- url: url[0] === '/' ? baseURL + url : url,
- name: data.name,
- header,
- filePath: data.filePath,
- formData: body,
- success: async res => {
- clearTimeout(timer)
- res.statusCode !== 200 ? await this.onerror(method, url, data, `网络请求异常:服务器响应异常:状态码:${res.statusCode}`) : '',
- this.interceptors.response.intercept(res.statusCode === 200 ? resolve : reject, { success: res.statusCode === 200, ...res }, method, url, data)
- },
- fail: async res => {
- clearTimeout(timer)
- await this.onerror(method, url, data, aborted ? '网络请求失败:主动取消' : '网络请求失败:(URL无效|无网络|DNS解析失败)')
- aborted ? reject('网络请求失败:主动取消') : reject('网络请求失败:(URL无效|无网络|DNS解析失败)')
- }
- })
- requestTask.onProgressUpdate(progressUpdateHandle)
- timer = setTimeout(async () => {
- requestTask.abort()
- await this.onerror(method, url, data, '网络请求失败:超时取消')
- reject('网络请求时间超时')
- }, timeout || 12345)
- })
- }), { get: (target, prop) => prop === 'abort' ? abort : prop === 'onProgressUpdate' ? onProgressUpdate : Reflect.get(target, prop).bind(target) })
- },
- request(method, url, data) {
- let timer, requestTask, aborted = false, abort = () => {
- aborted = true
- requestTask ? requestTask.abort() : ''
- }
- return new Proxy(new Promise((resolve, reject) => {
- this.interceptors.request.intercept({ header: header || {}, body: data || {} }, method, url, data).then(async ({ header, body: data }) => {
- if (aborted) {
- await this.onerror(method, url, data, '网络请求失败:主动取消')
- return reject('网络请求失败:主动取消')
- }
- requestTask = uni.request({
- url: url[0] === '/' ? baseURL + url : url,
- data, method, header,
- success: async res => {
- clearTimeout(timer)
- res.statusCode !== 200 ? await this.onerror(method, url, data, `网络请求异常:服务器响应异常:状态码:${res.statusCode}`) : ''
- this.interceptors.response.intercept(res.statusCode === 200 ? resolve : reject, { success: res.statusCode === 200, ...res }, method, url, data)
- },
- fail: async res => {
- uni.showModal({
- content: JSON.stringify(res)
- })
- clearTimeout(timer)
- await this.onerror(method, url, data, aborted ? '网络请求失败:主动取消' : '网络请求失败:(URL无效|无网络|DNS解析失败)')
- aborted ? reject('网络请求失败:主动取消') : reject('网络请求失败:(URL无效|无网络|DNS解析失败)')
- }
- })
- timer = setTimeout(async () => {
- requestTask.abort()
- await this.onerror(method, url, data, '网络请求失败:超时取消')
- reject('网络请求时间超时')
- }, timeout || 12345)
- })
- }), { get: (target, prop) => prop === 'abort' ? abort : Reflect.get(target, prop).bind(target) })
- },
- interceptors: {
- request: {
- interceptors: [],
- use(fun) { this.interceptors.push(fun) },
- async intercept(config, method, url, data) {
- for (let i = 0; i < this.interceptors.length; i ++) {
- config = await this.interceptors[i](config, method, url, data)
- }
- return config
- }
- },
- response: {
- interceptors: [],
- use(fun) { this.interceptors.push(fun) },
- async intercept(STATUS, response, method, url, data) {
- for (let i = 0; i < this.interceptors.length; i ++) {
- response = await this.interceptors[i](response, method, url, data)
- }
- if (response.success) {
- try {
- return STATUS(typeof response.data === 'string' ? JSON.parse(response.data) : response.data)
- } catch(e) {
- return STATUS(response.data)
- }
- } else {
- delete response.success
- return STATUS(response, method, url, data)
- }
-
- }
- }
- }
- }
- }
|