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; } //token当参数添加 const token = window.sessionStorage.getItem('token'); url = `${url}?token=${token ? token : ''}`; const cloneData = cloneDeep(data); options.url = method.toLocaleLowerCase() === 'get' ? `${url}${isEmpty(cloneData) ? '' : '&'}${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) { config.headers.common['club'] = 'cku'; const token = window.sessionStorage.getItem('token'); 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); }, ); // 添加一个响应拦截器处理 axios.interceptors.response.use( function(response) { //处理token setToken(response); return response; }, function(error) { // Do something with response error console.dir(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 requestEndTime = new Date(); if (isDevelopmentEnv) { console.log(response); 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, }); }); } /** * @description: 根据response设置token * @param {type} * @return: * @author: zhoupeng */ const setToken = response => { const sessionStorage = window.sessionStorage; try { console.log('开始处理token', Config.apis.cku.user.loginByMobile.indexOf(responseURL)); console.log('开始处理token', Config.apis.cku.user.loginByMobile); const responseURL = response.request.responseURL; const { data } = response; if ( responseURL.indexOf(Config.apis.cku.user.loginByMobile) !== -1 || responseURL.indexOf(Config.apis.cku.user.loginByWechat) !== -1 || responseURL.indexOf(Config.apis.cku.user.register) !== -1 || responseURL.indexOf(Config.apis.cku.user.bindMobile) !== -1 ) { if (data && data.rc === Config.constant.codeSuccess) { window.sessionStorage.setItem('token', data.data.token); } else { window.sessionStorage.setItem('token', ''); } } } catch (error) { console.log('=============保存token失败', error); } };