// @flow /** * @name utils/request.js * @fileOverview 封装异步请求调用 * @author liyi */ import axios from 'axios'; import _ from 'lodash'; import NProgress from 'nprogress'; import 'nprogress/nprogress.css'; //import { updateExpiredTime } from 'utils/authPermit'; NProgress.configure({ showSpinner: true, easing: 'ease', speed: 500, }); /** * 检测请求响应状态码,检测请求结果状态,错误时抛出异常 * @param {*} response */ /* eslint-disable prefer-promise-reject-errors */ function handleResponse(response) { NProgress.done(); if (response && response.status >= 200 && response.status < 300) { const { data: result } = response; if ( (result.code && result.code > 0) || result.success === true || result.code === '1' || typeof result.code === 'string' ) { const authorization = response.headers.authorization || response.headers.Authorization; if (authorization) { localStorage.setItem('AI.token', authorization); } return Promise.resolve({ code: result.code, message: result.message, data: _.get(result, 'data', result.value || ''), pagination: result.pagination, }); } if ((result.code && result.code < 0) || result.success === false) { return Promise.reject({ code: result.code, message: result.message, error: result.error || result.errors || '', }); } return Promise.resolve({ data: _.get(result, 'data', result.value) || response.data, }); } return Promise.reject({ code: _.get(response || {}, 'status', -1), message: _.get(response || {}, 'statusText', '请求异常'), error: _.get(response || {}, 'statusText', '请求异常'), data: _.get(response, 'result.data', {}), }); } /* eslint-disable prefer-promise-reject-errors */ function handleError(error) { NProgress.done(); const { statusText, status } = error.response || {}; let errInfo = _.get(error.response || {}, ['data', 'message']) || error.message || '请求服务出错'; const errCode = _.get(error.response || {}, ['data', 'code']) || error.code || -1; // 请求资源不存在 if (status === 404) errInfo = `请求的资源[${_.get(error.response, ['config', 'url'])}]不存在!`; // 请求超时打断 if (errCode === 'ECONNABORTED') { errInfo = '服务连接失败或请求超时!'; } return Promise.reject({ code: errCode, message: errInfo || statusText, error: errInfo || statusText, data: _.get(error.response, 'data.data', {}), }); } /** * 创建axios实例,设置默认api请求跟路径、超时时间,请求头content-type */ const axiosInstance = axios.create({ timeout: 1200000, headers: { 'Content-Type': 'application/json;charset=UTF-8', Accept: 'application/json', }, }); /** * axios 拦截 * TODO 通过config为每次api请求调用添加token */ axiosInstance.interceptors.request.use( function(config) { const token = localStorage.getItem('AI.token'); if (token) { //判断token是否存在 config.headers.Authorization = token; //将token设置成请求头 } if (config.basePath && config.basePath !== '') { config.baseURL = 'http://' + config.basePath; } //updateExpiredTime(); if (!config.sync) { NProgress.start(); } return config; }, function(error) { return Promise.reject(error); } ); /** * axios 拦截 */ axiosInstance.interceptors.response.use(response => handleResponse(response), error => handleError(error)); export default axiosInstance;