import axios from 'axios'; import { cloneDeep, isEmpty } from 'lodash'; import qs from 'qs'; import * as development from './developmentProperties'; import Config from './config'; const { CancelToken } = axios; window.cancelRequest = new Map(); export default function request(options, preName = '', domainType = '') { let { data, url, method = 'get' } = options; //改变请求路径 switch (preName) { case 'mapApi': break; case 'test': url = development.test() + url; break; case 'product': url = development.product() + url; break; case 'nothing': url = url; break; default: url = '/'; } // 改变请求域名 switch (domainType) { case 'test': url = Config.domains.test + url; break; default: url = window.location.origin + url; break; } const cloneData = cloneDeep(data); // options.url = // method.toLocaleLowerCase() === 'get' // ? `${url}${isEmpty(cloneData) ? '' : '?'}${qs.stringify(cloneData)}` // : url; //token当参数添加 const token = window.sessionStorage.getItem('token'); // const token = // 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJ1c2VySWRcIjpcIjc5MTQ0XCIsXCJsb2dpblR5cGVcIjpcIm5ld2FwcFwiLFwibmFtZVwiOlwiXCIsXCJtb2JpbGVcIjpcIjE1NjMxMjMxMjQxXCIsXCJja3VVc2VySWRcIjpcIjQ4NzVcIixcImNhYWNVc2VySWRcIjpcIlwiLFwiY3N2VXNlcklkXCI6XCJcIn0iLCJpc3MiOiJkZXZlbG9wIiwiZXhwIjoxNTkxNDMzNzc4LCJpYXQiOjE1ODg4NDE3Nzh9.UZks8biQTXy2I4FYfMo2n-vJMlfFZo-da31gxA07c1Y'; url = `${url}?token=${token ? token : ''}`; options.url = method.toLocaleLowerCase() === 'get' ? `${url}&${qs.stringify(cloneData)}` : url; options.cancelToken = new CancelToken(cancel => { window.cancelRequest.set(Symbol(Date.now()), { pathname: window.location.pathname, cancel, }); }); const isDevelopmentEnv = process.env.NODE_ENV !== 'production'; const requestStartTime = new Date(); if (isDevelopmentEnv) { if (console.group) { console.group('%c接口请求', 'color: green'); } console.log( `%c[%s] %c%s %c@%s`, 'color: green', options.method, 'color: #00a7e0', options.url, 'font-size: 10px;color: #bbb', requestStartTime, ); console.log('%c参数: ', 'color: #555', options.data); } axios.defaults.headers.common['token'] = ''; //添加一个请求拦截器 axios.interceptors.request.use( function(config) { const token = window.sessionStorage.getItem('token'); const club = window.sessionStorage.getItem('club'); config.headers.common['club'] = club; if (token) { config.headers.common['token'] = token; } return config; }, function(error) { // Do something with request error console.info('error: '); console.info(error); return Promise.reject(error); }, ); return axios(options) .then(response => { if (isDevelopmentEnv) { if (response.status > 400) { console.log('%c错误: %d %s', 'color: red', response.status, response.statusText); } } const { statusText, status, data } = response; const responseUrl = response.request.responseURL; const requestEndTime = new Date(); if (isDevelopmentEnv) { console.log( '%c[RESP] %c (%s) %s %c耗时 %dms %c@%s', data.rc === 0 ? 'color: green' : 'color: red', data.rc === 0 ? 'color: #555' : 'color: red', data.rc, data.msg, 'font-size: 10px;color: orange', requestEndTime - requestStartTime, 'font-size: 10px;color: #bbb', requestEndTime, ); console.log('%c结果:', 'color: #555', data.data); if (console.groupEnd) { console.groupEnd(); } } let result = {}; if (typeof data === 'object') { result = data; if (Array.isArray(data)) { result.list = data; } } else { result.data = data; } return Promise.resolve({ success: true, message: statusText, statusCode: status, ...result, }); }) .catch(error => { const { response, message } = error; if (response.status === 401) { localStorage.setItem('jwt', ''); return Promise.reject({ message: '登录已超时,请重新登录', }); } if (response.status === 413) { return Promise.reject({ message: '上传文件太大', }); } if (response.status === 403) { return Promise.reject({ message: '对不起,您没有权限!', }); } if (isDevelopmentEnv) { console.log( '%c错误: %s %d %s', 'color: red', error.message, response.status, response.statusText, ); if (console.groupEnd) { console.groupEnd(); } } if (String(message) === 'cancle request') { return { success: false, }; } let msg; let statusCode; if (response && response instanceof Object) { const { data, statusText } = response; statusCode = response.status; msg = data.msg || statusText; } else { statusCode = 600; msg = error.message || '网络异常'; } /* eslint-disable */ return Promise.reject({ success: false, statusCode, message: msg, }); }); }