/** * Http 请求 * * 小程序请使用增强编译 * * 调用例子 * Req.http.post({ * url: '', * data: {}, * }) */ import Axios from '../libs/axios' /* json转formdata(序列化),仅支持一级字面量和字面量数组 */ function jsonToFormData(json) { var arr = [] var e = encodeURIComponent for (var key in json) { var item = json[key] var res if (item instanceof Array) { res = [] item.map(function(o) { res.push(e(key) + '=' + e(o)) }) res = res.join('&') } else { res = e(key) + '=' + e(item) } arr.push(res) } return arr.join('&') } /** * Http 类 * @param http_option {Object} * -@key {string} baseUrl --请求链接前置 * -@key {object} getChangeRequestParameter --get请求参数 * -@key {object} postChangeRequestParameter --post请求参数 * -@key {function} beforeRequest --请求前处理 * -@key {function} beforeFlow --请求前流程 * -@key {function} successChangeData --请求完成后,处理数据 * -@key {function} httpEventCode --请求完成后,处理委托 * -@key {function} afterFlow --请求完成后流程 * -@key {function} afterRequest --请求后事件 * -@key {function} afterMultiRequests --同时多次请求完成之后 */ function Http (http_option) { // 请求配置数组,标记是否批量请求 var requestArr = [] // 请求总线 function Request (request_option) { // 默认 data 为对象 request_option.data = request_option.data || {} // 请求配置加入数组 requestArr.push(request_option) // 触发请求前事件 if (http_option.beforeRequest) { http_option.beforeRequest({http_option, request_option}) } // 使用 promise 完成请求 return new Promise ((resolve, reject) => { // vue-cli中改用mockjs // mock假数据流程 // 20210121 - 暂停使用mockjs if (http_option.mockFlow && http_option.ismock) { resolve(http_option.mockFlow({http_option, Request, request_option})) return } // 请求前自定义流程 if (http_option.beforeFlow && !request_option.skip_before_flow) { // skip 为 true 时,不仅如此此流程 requestArr.splice(0, 1) resolve(http_option.beforeFlow({http_option, Request, request_option})) return } var url = request_option.url if (!url) { throw new Error('url不能为空') } // 不增加domain设定 if (request_option.udData && request_option.udData.nodomain) { if (!/^https?:\/\//.test(url)) { // 使用本项目域名 if (/^\//.test(url)) { url = location.origin + url } else { // 修复访问本地json问题 url = location.origin + location.pathname.replace('index.html', '') + url } } } else if (!/^https?:\/\//.test(url)) { url = http_option.baseUrl + url } // 定义请求配置 var request_config = { method: request_option.method, url, data: request_option.data, header: request_option.header || {'Content-type':'application/x-www-form-urlencoded'}, // 请求成功 success (res) { // 请求成功后,处理数据 if (http_option.successChangeData) { res = http_option.successChangeData(res) } // 触发 code 委托事件 if (http_option.httpEventCode && http_option.httpEventCode['code'+res.status]) { http_option.httpEventCode['code'+res.status](res); } // 请求后自定义流程 if (http_option.afterFlow) { resolve(http_option.afterFlow({ res, request_config, request_option, http_option, Request, })) } // 触发请求后事件 if (http_option.afterRequest) { http_option.afterRequest({http_option, res}) } if (request_option.udData) { // 返回全部数据 if (request_option.udData.fullData === true) { resolve(res) } } resolve(res.data) }, // 请求失败 fail (err) { // console.error(err) var code = err.response && err.response.status // 触发 code 委托事件 if (code && http_option.httpEventCode && http_option.httpEventCode['code'+code]) { http_option.httpEventCode['code'+code](err, url) } // alert('请求失败,错误代号:'+code) reject(err) }, // 无论成功或者失败都会执行 complete () { requestArr.splice(0, 1) if (requestArr.length === 0) { // http_option.debug && console.log('触发 afterMultiRequests', request_config) // 批量请求全部完成,触发事件 if (http_option.afterMultiRequests) { http_option.afterMultiRequests(request_option) } } } }; // get 方法时,去掉 data if (request_option.method === 'GET') { delete request_config.data } // 打印请求信息 http_option.debug && console.log('请求', request_config) // 处理header和data的关系 if (request_config.header['Content-type'] == 'application/x-www-form-urlencoded') { request_config.data = request_config.data ? jsonToFormData(request_config.data) : {} } // 开始请求 // wx.request(request_config) Axios({ method: request_config.method, headers: request_config.header, url: request_config.url, data: request_config.data }).then((res) => { // http_option.debug && console.log('成功回调', res) request_config.success(res) request_config.complete(res) }).catch((res) => { // http_option.debug && console.log('失败回调', res) request_config.fail(res) request_config.complete(res) }) }) } var obj = { // get请求 // @param get_option {Object} 请求配置 // -@key url {String} 请求路径 // -@key params {Object} 请求参数 // -@key udData {Object} 自定义扩展字段 // @return {Promise} get (get_option) { // 请求前,统一处理请求参数 if (http_option.getChangeRequestOption) { get_option = http_option.getChangeRequestOption(get_option) } // params对象序列化到url中 if (get_option.params) { let arr = [] for (let i in get_option.params) { if (get_option.params.hasOwnProperty(i)) { arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(get_option.params[i])) } } if (/\?/.test(get_option.url)) { get_option.url += '&' + arr.join('&') } else { get_option.url += '?' + arr.join('&') } } // 使用promise完成Request调用 return new Promise ((resolve, reject) => { Request({ method: 'GET', url: get_option.url, udData: get_option.udData, header: get_option.header, mockData: get_option.mockData, }).then((data) => { resolve(data) }).catch((res)=>{ // ↓↓↓↓↓↓↓↓↓↓ 临时处理失败 // var junPage = getApp().getCurPage() // junPage = junPage && junPage.selectComponent('#junPage') // if (junPage && junPage.fail) { // console.log('设置fail') // junPage.fail() // } // ↑↑↑↑↑↑↑↑↑↑ 临时处理失败 reject(res) }) }) }, // post请求 // @param post_option {Object} 请求配置 // -@key url {String} 请求路径 // -@key data {Object} 请求参数 // -@key udData {Object} 自定义扩展字段 // @return {Promise} post (post_option) { // 请求前,统一处理请求参数 if (http_option.postChangeRequestOption) { post_option = http_option.postChangeRequestOption(post_option) } // 使用promise完成Request调用 return new Promise ((resolve, reject) => { Request({ method: 'POST', url: post_option.url, data: post_option.data, udData: post_option.udData, header: post_option.header, mockData: post_option.mockData, }).then((data) => { resolve(data) }).catch((res)=>{ // ↓↓↓↓↓↓↓↓↓↓ 临时处理失败 // var junPage = getApp().getCurPage() // junPage = junPage && junPage.selectComponent('#junPage') // if (junPage && junPage.fail) { // console.log('设置fail') // junPage.fail() // } // ↑↑↑↑↑↑↑↑↑↑ 临时处理失败 reject(res) }) }) } } obj.getFN = obj.get obj.postFN = obj.post return obj; } export default Http