const axios = require('axios') import { Message } from 'element-ui' import { getToken } from '@/utils/auth' function isF() { return typeof arguments[0] === 'function' } /* 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('&') } function Http(http_o) { // 返回值 Object // 参数说明 // o.baseUrl 这个参数根据传入的基础路径会初始化http中的所有请求方法 // ... 待扩展 var requestArr = [] // 请求次数 return { // 这个对象是包含全部所有的请求 postFN(post_o, successCallBack, failCallBack) { // post 方法 // 参数说明 // post_o.url 指的是请求的路径 // post_o.baseChgUrl 可动态切换的接口 // params 接受 对象序列化 传参 即 将传入的 params(对象) 参数 序列化为 url 传参的方式如 xxx.com/api?id=1212&name=456 // udData Object:即userDefined Data 用户自定义数据,这是一个扩展字段 // mockData Object 测试数据 Request({ method: 'post', header: post_o.header, params: post_o.params || false, url: post_o.url, baseChgUrl: post_o.baseChgUrl, // 动态切换接口 udData: post_o.udData, // 预留扩展字段 mockData: post_o.mockData // 测试数据 }).then(data => { console.log('请求:', post_o.url, data, post_o.params) // 登录失效 if (Number(data.code) === 603) { Message({ type: 'error', showClose: true, duration: 10000, message: data.msg }) setTimeout(() => { sessionStorage.clear() // 未登录,刷新页面出发页面 checkLoginFN跳转登录页面 location.reload() }, 800) return } // todo 无code时的报错 if (Number(data.code) === 100) { // 请求成功 isF(successCallBack) && successCallBack(data.data) } else { // 请求失败 if (isF(failCallBack)) { failCallBack(data) } else { Message({ type: 'error', showClose: true, duration: 10000, message: data.msg }) } } }) }, getFN(get_o, successCallBack, failCallBack) { // get 方法 // 参数说明 // get_o.url 指的是请求的路径 // get_o.baseChgUrl 可动态切换的接口 // params 接受 对象序列化 传参 即 将传入的 params(对象) 参数 序列化为 url 传参的方式如 xxx.com/api?id=1212&name=456 // udData Object:即userDefined Data 用户自定义数据,这是一个扩展字段 // mockData Object 测试数据 Request({ method: 'get', header: get_o.header, params: get_o.params || false, url: get_o.url, baseChgUrl: get_o.baseChgUrl, // 动态切换接口 udData: get_o.udData, // 预留扩展字段 mockData: get_o.mockData // 测试数据 }).then(data => { console.log('请求:', get_o.url, data, get_o.params) // 登录失效 if (Number(data.code) === 603) { Message({ type: 'error', showClose: true, duration: 10000, message: data.msg }) setTimeout(() => { sessionStorage.clear() // 未登录,刷新页面出发页面 checkLoginFN跳转登录页面 location.reload() }, 800) return } if (Number(data.code) === 100) { // 请求成功 isF(successCallBack) && successCallBack(data.inf) } else { // 请求失败 if (isF(failCallBack)) { failCallBack(data) } else { Message({ type: 'error', showClose: true, duration: 10000, message: data.msg }) } } }) } } function Request(request_o) { // 总请求方法,这是一个被独立处理出来的方法,因为这个方法是一个比较特殊的方法,首先这个方法不应被暴露出来, // 然后因为根据项目的独特性,最底层的拦截、加密、权限的实现和代码都有所不同,这里应该独立处理,方便以后移植和复用 // 这个方法是所有请求方法的底层方法,具有错误码拦截,权限管理(鉴权)等 拦截的功能 // 返回值 Object // 参数说明 // o.method 请求类型 // o.url 请求路径 // o.params 请求参数 // o.baseUrl 基本路径 // udData Object:即userDefined Data 用户自定义数据,这是一个扩展字段 // fullData 这个字段为真的话,将返回 服务端返回的所有数据,默认返回data requestArr.push(request_o) // 将请求加入数组 if (http_o.startRequest) { http_o.startRequest(http_o, request_o) // 事件委托,请求之前 } return new Promise((resolve, reject) => { // 添加切换调用接口域名功能 -- start var ajaxUrl if (request_o.baseChgUrl) { ajaxUrl = request_o.baseChgUrl + request_o.url } else { ajaxUrl = http_o.baseUrl + request_o.url } // 添加切换调用接口域名功能 -- end // 处理传参 -- start // 将token放到params里 var noToken = request_o.udData && request_o.udData.noToken // noToken则不传token var adminToken = getToken() // 放到连接后得请求参数 var urlEncodes = {} if (adminToken && !noToken) { urlEncodes = { adminToken: adminToken } // ...urlEncodes, } // // 将请求参数放到链接后面 var paramsUrl = urlEncode(urlEncodes) if(!/\?/.test(ajaxUrl)) { paramsUrl = paramsUrl.replace('&', '?') } ajaxUrl = ajaxUrl + paramsUrl // console.log(ajaxUrl) // console.log(request_o.params) // 处理传参 -- end // request_o.params.adminToken = adminToken var requestConfig = { // 請求對象 method: request_o.method, url: ajaxUrl, data: request_o.params, header: request_o.header || { 'Content-type': 'application/x-www-form-urlencoded' // 默认值 } } // 转formData if (requestConfig.header['Content-type'] === 'application/x-www-form-urlencoded') { requestConfig.data = requestConfig.data ? jsonToFormData(requestConfig.data) : {} } // 使用测试数据 if (http_o.isMock) { console.log('开始模拟等待800ms') // 模拟请求 if (http_o.httpEventCode && http_o.httpEventCode['code200']) { http_o.httpEventCode['code200'](request_o.mockData) // 事件委托,处理错误 } if (http_o.endRequest) { http_o.endRequest({ ...http_o, ...request_o.mockData }) // 事件委托,请求之前 } setTimeout(() => { console.log('结束模拟等待800ms') resolve(request_o.mockData) // 无论成功或者失败都会执行 requestArr.splice(0, 1) if (requestArr.length === 0) { // 批量请求全部完成 if (http_o.concurrentRequests) { http_o.concurrentRequests() } } }, 800) return } axios(requestConfig).then((res) => { if (http_o.httpEventCode && http_o.httpEventCode['code' + res.status]) { http_o.httpEventCode['code' + res.status](res) // 事件委托,处理错误 } if (http_o.endRequest) { http_o.endRequest({ ...http_o, ...res }) // 事件委托,请求之前 } if (http_o.defindFlow) { // 自定义流程 resolve(http_o.defindFlow({ requestConfig: requestConfig, res: res, Request: Request })) } if (request_o.udData && request_o.udData.fullData === true) { // 如果这里的fullData 为真的话,将返回服务器返回的所有数据 resolve(res) } resolve(res.data) }).catch((err) => { // console.log('异步报错:',err); var code err.response && (code = err.response.status) // 请求错误码 if (http_o.httpEventCode && http_o.httpEventCode['code' + code]) { http_o.httpEventCode['code' + code](err) // 事件委托,处理错误 } reject(err) }).finally(() => { // 无论成功或者失败都会执行 requestArr.splice(0, 1) if (requestArr.length === 0) { // 批量请求全部完成 if (http_o.concurrentRequests) { http_o.concurrentRequests() } } }) }) } // 对象转url参数 function urlEncode(param, key, encode) { if (param == null) return '' var paramStr = '' var t = typeof (param) if (t === 'string' || t === 'number' || t === 'boolean') { paramStr += '&' + key + '=' + ((encode == null || encode) ? encodeURIComponent(param) : param) } else { for (var i in param) { var k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i) paramStr += urlEncode(param[i], k, encode) } }screenLeft return paramStr } } export { Http }