axios 封裝【滿足常規數據上傳及file上傳】
/* 封裝axios */
const axios = require('axios');
import {
featchApiHeader,
formApiHeader,
baseApiUrl
} from './requestUtil.js';
const {
Loading,
Message
} = require('element-ui');
import router from '@/routes/routes'
import store from '@/store/store'
import qs from 'qs'
let loadingInstance = null; //loading實例
/* 創建實例時的基礎默認配置,可以在請求時進行重寫覆蓋 */
const instance = axios.create({
baseURL: baseApiUrl,
timeout: 5000,
method: 'post',
headers: featchApiHeader
})
/* 攔截器 */
/**
* @Description:
* - 在request 內通過對data類型的校驗,區分是一般的post還是formdata文件上傳
* - 根據類型的不同改變成不同的headers
* -
*/
instance.interceptors.request.use(
config => {
loadingInstance = Loading.service({
text: "請求中...",
spinner: 'el-icon-loading'
});
if (config.method.toLowerCase() == "post") {
let newdata = config.data;
if (config.data instanceof FormData) { //文件類,文件類不需要stringify
Object.assign(config.headers, formApiHeader); //修改`Content-Type`
newdata.append("accessStr", localStorage.getItem("apiToken") || '')
} else { //非文件類,stringify
//空處理
newdata = (typeof newdata == 'object' && Object.keys(newdata).length >= 0) ? newdata : {};
newdata = {
...newdata,
accessStr: localStorage.getItem("apiToken") || ''
}
newdata = qs.stringify(newdata);
}
config.data = newdata;
}
return config
},
error => {
loadingInstance.close();
Message({
showClose: true,
message: '請求錯誤,請您稍后重試!',
type: 'error'
});
return Promise.reject(error)
},
)
instance.interceptors.response.use(
response => {
loadingInstance.close();
let resStatus = response.status;
if (resStatus == 200) {
return Promise.resolve(response)
} else {
return Promise.reject(response)
}
},
error => {
loadingInstance.close();
if (error.response.status) {
switch (error.response.status) {
case 401: //未登錄,從哪里來回哪里去
router.replace({
path: '/index',
query: {
redirect: router.currentRoute.fullPath
}
});
break;
case 403: //token過期
Message({
message: '登錄過期,請重新登錄',
duration: 1500
});
localStorage.removeItem("apiToken"); //清除token
store.commit("loginSuccess", ""); //全局通知loginSuccess為空
break;
case 404:
Message({
message: '網絡請求不存在',
duration: 1500
});
break;
case 500, 501, 503: //服務端錯誤
Message({
message: '請求異常,請您稍后重試!',
duration: 1500
});
break;
default:
Message({
message: error.response.data.message,
duration: 1500
});
break;
}
return Promise.reject(error)
}
},
)
export default instance
/**
* @Description:
* - 處理請求頭,
* - apitoken、針對一般的post和文件上傳,設置不同的headers
* - 根據環境獲取不同的baseUrl
*/
const getApitoken = () => {
return localStorage.getItem("apiToken") || '' //在登錄時得到后存儲起來
}
const commmonHeader = {
'Accept': 'application/json',
'Authorization': `Bearer ${getApitoken()}`
}
/* 常規的 */
export const featchApiHeader = {...commmonHeader,
'Content-Type': 'application/x-www-form-urlencoded'
}
/* 文件的 */
export const formApiHeader ={...commmonHeader,
'Content-Type': 'multipart/form-data'
}
export const baseApiUrl = process.env.VUE_APP_API_BASEURL