/* * @Author: ch * @Date: 2022-03-17 16:36:59 * @LastEditors: ch * @LastEditTime: 2022-04-20 11:57:58 * @Description: 针对uniapp request请求做了一次封装,使用思维参考axios * * * 方法 * method(option) 自定义请求,同uni.request * get(url, params, header) url 请求地址 params 请求参数 * header 请求头会针对当前请求头设置特定的请求头。传了此参数request拦截器会失效 * post(url, data, header) 同上 * put(url, data, header) 同上 * delete(url, data, header) 同上 * use(hookName, callback) 注入hook拦截器 hookName 拦截器名(request/response/error) callback拦截器具体见拦截器说明 * * 属性 * baseUrl 请求地址前缀 * * 拦截器 * request 请求前拦截,在这可统一设置请求头,请求体等参数。uni.request的第一个参数option都可以重置 * success 请求成功结果拦截 * error 请求错误拦截 * * 示例 * const myReq = new MsbUniRequest(); * myReq.baseUrl = 'xxxx' * myReq.use('request', (option)=>{ * // option 返回请求配置 * .....这里可以对option做一系列操作 * return option //最后返回一个正确的请求配置 * }) * myReq.use('success', (res)=>{ * //res 返回请求结果 * let newRes = ..... //这里可以对请求结果做统一处理 * return newRes * }) * * myReq.use('error', (error)=>{ * //error 返回错误结果 * let newError = ..... //这里可以对请求错误做统一处理 * return newError * }) */ class MsbUniRequest { constructor (option){ this.baseUrl = ''; this.header = { repeat : true } this.hook = { request : null, success : null, error : null } } method(option){ option.header = {...this.header,...option.header}; option.url = this.baseUrl + option.url; if(this.hook.request){ option = this.hook.request(option); }; if(!option){ throw new Error('没有请求配置,或是request拦截未做return'); } if(option.constructor === Promise){ return option } return new Promise((resolve, reject)=>{ console.log(option); uni.request({ ...option, success: res => { const response = res || res[1]; // 200 - 399状态为正常 if(response.statusCode >= 200 && response.statusCode < 400){ if(!this.hook.success){ resolve(response); }else{ let newRes = this.hook.success(response, option); // 业务结果处理可能为一个Promise对象,根据结果调用错误或正确状态 if(newRes.constructor === Promise){ newRes.then(res => { resolve(res); }, error =>{ reject(error); }) }else{ resolve(newRes); } } return false; } reject(this.hook.error ? this.hook.error(response, option) : response); }, fail: error =>{ reject(this.hook.error ? this.hook.error(error, option) : error); } }); }); } use(hookName, cb){ this.hook[hookName] = cb; } get(url, data, header){ return this.method({method : 'GET', url, data, header}); } post(url, data, header){ return this.method({method : 'POST', url, data, header}); } put(url, data, header){ return this.method({method : 'PUT', url, data, header}); } delete(url, data, header){ return this.method({method : 'DELETE', url, data, header}); } } export default MsbUniRequest;