拦截器(添加公共token)
service.interceptors.request.use(
(config) => {
//发请求前做的一些处理,数据转化,配置请求头,设置token,设置loading等,根据需求去添加
config.data = JSON.stringify(config.data); //数据转化,也可以使用qs转换
config.headers['Content-Type'] = 'application/json';
//如有需要:注意使用token的时候需要引入cookie方法或者用本地localStorage等方法,推荐js-cookie
const token = localStorage.getItem('EOAP-LOGIN-TOKEN')
? localStorage.getItem('EOAP-LOGIN-TOKEN')
: '';
// M0YxNDhEMkVCMzUxQ0EyOUYwOENGNTA2MDRERjQ5M0E1MTM3QjE1OUJDNzQzODBGNzJFQ0MxQ0M1Nzc1OEVFQw==
if (token) {
config.headers['EOAP-LOGIN-TOKEN'] = token;
}
return config;
},
(error) => {
Promise.reject(error);
}
);
// 3.响应拦截器
service.interceptors.response.use(
(response) => {
//接收到响应数据并成功后的一些共有的处理,关闭loading等
// response.config.metadata.endTime = new Date();
// response.duration =
// response.config.metadata.endTime - response.config.metadata.startTime;
switch (response.data.code) {
case 200:
if (response.data.msg && response.data.msg.length > 0) {
window.$message.success(response.data.msg);
}
break;
case 400:
window.$message.error(response.data.msg);
break;
case 401:
localStorage.clear();
window.$message.error(response.data.msg);
redirectLogin();
break;
case 402:
// localStorage.clear();
window.$message.error(response.data.msg);
// redirectLogin();
break;
case 404:
// localStorage.clear();
window.$message.warning(response.data.msg);
// redirectLogin();
break;
case 413:
// localStorage.clear();
window.$message.error(response.data.msg);
// redirectLogin();
break;
case 500:
window.$message.error(response.data.msg);
// redirectLogin();
break;
}
// if (response.data.errorNumber !== 0) {
// ElMessage({
// type: 'error',
// grouping: true,
// message: response.data.message,
// });
// // eslint-disable-next-line no-unused-expressions, eqeqeq
// response.data.errorNumber == 204 ? redirectLogin() : '';
// } else {
return response;
// }
},
(error) => {
reqNum--;
if (reqNum === 0) {
store.commit('changeLoadingStatus', false); //关闭全局弹窗
}
// error.config.metadata.endTime = new Date();
// error.duration =
// error.config.metadata.endTime - error.config.metadata.startTime;
// console.log(error, 887654);
// /***** 接收到异常响应的处理开始 *****/
if (error && error.response) {
// 1.公共错误处理
// 2.根据响应码具体处理
switch (error.response.status) {
case 400:
error.message = '错误请求';
break;
case 401:
localStorage.clear();
error.message = '未授权,请重新登录';
break;
case 403:
error.message = '拒绝访问';
break;
case 404:
error.message = '请求错误,未找到该资源';
// window.location.href = "/NotFound"
break;
case 405:
error.message = '请求方法未允许';
break;
case 408:
error.message = '请求超时';
break;
case 500:
error.message = error.response.data.msg;
break;
case 501:
error.message = '网络未实现';
break;
case 502:
error.message = '网络错误';
break;
case 503:
error.message = '服务不可用';
break;
case 504:
error.message = '网络超时';
break;
case 505:
error.message = 'http版本不支持该请求';
break;
default:
error.message = error.response.data.msg;
}
} else {
// 超时处理
if (JSON.stringify(error).includes('timeout')) {
// Toast("服务器响应超时,请刷新当前页");
window.$message.error('服务器响应超时,请刷新当前页');
}
error.message = '连接服务器失败';
}
// Message(error.message);
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-unused-expressions
error.response.status === 401 ? redirectLogin() : '';
window.$message.error(error.message);
/***** 处理结束 *****/
//如果不需要错误处理,以上的处理过程都可省略
return Promise.resolve(error.response);
}
);
项目全局loading
let reqNum = 0; // 当前正在进行的网络请求的数量
//请求拦截器中添加
(config) => {
reqNum++;
if (reqNum > 0) {
store.commit('changeLoadingStatus', true); //打开全局弹窗
}
}
//响应拦截器中添加
(response) => {
reqNum--;
if (reqNum === 0) {
store.commit('changeLoadingStatus', false); //关闭全局弹窗
}
},
(error) => {
reqNum--;
if (reqNum === 0) {
store.commit('changeLoadingStatus', false); //关闭全局弹窗
}
}
mutations: {
changeLoadingStatus(state, status) {
state.isLoading = status;
},
}
再在父组件上使用isLoading变量控制loading效果即可
切换页面取消未完成的请求
let reqNum = 0; // 当前正在进行的网络请求的数量
window._axiosPromiseArr = []; // axios网络请求数组
//请求拦截器
(config) => {
config.cancelToken = new axios.CancelToken((cancel) => {
window._axiosPromiseArr.push({ cancel });
});
}
router.beforeEach((to, from, next) => {
window._axiosPromiseArr &&
window._axiosPromiseArr.forEach((item) => {
item.cancel();
});
window._axiosPromiseArr = [];
next();
})
完整结构含其余基本封装
// 导入axios
import axios from 'axios';
// 使用toast做消息提醒
import Router from '@/route/index.js';
import env from './env';
import store from '../../store/index';
//1. 创建新的axios实例,
const service = axios.create({
// 公共接口
baseURL: env.baseURL,
// 超时时间 单位是ms,这里设置了3s的超时时间
timeout: 30 * 1000,
});
let reqNum = 0; // 当前正在进行的网络请求的数量
window._axiosPromiseArr = []; // axios网络请求数组
// 2.请求拦截器
service.interceptors.request.use(
(config) => {
reqNum++;
config.cancelToken = new axios.CancelToken((cancel) => {
window._axiosPromiseArr.push({ cancel });
});
if (reqNum > 0) {
store.commit('changeLoadingStatus', true); //打开全局弹窗
}
//发请求前做的一些处理,数据转化,配置请求头,设置token,设置loading等,根据需求去添加
config.data = JSON.stringify(config.data); //数据转化,也可以使用qs转换
config.headers['Content-Type'] = 'application/json';
//如有需要:注意使用token的时候需要引入cookie方法或者用本地localStorage等方法,推荐js-cookie
const token = localStorage.getItem('EOAP-LOGIN-TOKEN')
? localStorage.getItem('EOAP-LOGIN-TOKEN')
: '';
// M0YxNDhEMkVCMzUxQ0EyOUYwOENGNTA2MDRERjQ5M0E1MTM3QjE1OUJDNzQzODBGNzJFQ0MxQ0M1Nzc1OEVFQw==
if (token) {
config.headers['EOAP-LOGIN-TOKEN'] = token;
}
return config;
},
(error) => {
Promise.reject(error);
}
);
// 3.响应拦截器
service.interceptors.response.use(
(response) => {
reqNum--;
if (reqNum === 0) {
store.commit('changeLoadingStatus', false); //关闭全局弹窗
}
//接收到响应数据并成功后的一些共有的处理,关闭loading等
// response.config.metadata.endTime = new Date();
// response.duration =
// response.config.metadata.endTime - response.config.metadata.startTime;
switch (response.data.code) {
case 200:
if (response.data.msg && response.data.msg.length > 0) {
window.$message.success(response.data.msg);
}
break;
case 400:
window.$message.error(response.data.msg);
break;
case 401:
localStorage.clear();
window.$message.error(response.data.msg);
redirectLogin();
break;
case 402:
// localStorage.clear();
window.$message.error(response.data.msg);
// redirectLogin();
break;
case 404:
// localStorage.clear();
window.$message.warning(response.data.msg);
// redirectLogin();
break;
case 413:
// localStorage.clear();
window.$message.error(response.data.msg);
// redirectLogin();
break;
case 500:
window.$message.error(response.data.msg);
// redirectLogin();
break;
}
// if (response.data.errorNumber !== 0) {
// ElMessage({
// type: 'error',
// grouping: true,
// message: response.data.message,
// });
// // eslint-disable-next-line no-unused-expressions, eqeqeq
// response.data.errorNumber == 204 ? redirectLogin() : '';
// } else {
return response;
// }
},
(error) => {
reqNum--;
if (reqNum === 0) {
store.commit('changeLoadingStatus', false); //关闭全局弹窗
}
// error.config.metadata.endTime = new Date();
// error.duration =
// error.config.metadata.endTime - error.config.metadata.startTime;
// console.log(error, 887654);
// /***** 接收到异常响应的处理开始 *****/
if (error && error.response) {
// 1.公共错误处理
// 2.根据响应码具体处理
switch (error.response.status) {
case 400:
error.message = '错误请求';
break;
case 401:
localStorage.clear();
error.message = '未授权,请重新登录';
break;
case 403:
error.message = '拒绝访问';
break;
case 404:
error.message = '请求错误,未找到该资源';
// window.location.href = "/NotFound"
break;
case 405:
error.message = '请求方法未允许';
break;
case 408:
error.message = '请求超时';
break;
case 500:
error.message = error.response.data.msg;
break;
case 501:
error.message = '网络未实现';
break;
case 502:
error.message = '网络错误';
break;
case 503:
error.message = '服务不可用';
break;
case 504:
error.message = '网络超时';
break;
case 505:
error.message = 'http版本不支持该请求';
break;
default:
error.message = error.response.data.msg;
}
} else {
// 超时处理
if (JSON.stringify(error).includes('timeout')) {
// Toast("服务器响应超时,请刷新当前页");
window.$message.error('服务器响应超时,请刷新当前页');
}
error.message = '连接服务器失败';
}
// Message(error.message);
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-unused-expressions
error.response.status === 401 ? redirectLogin() : '';
window.$message.error(error.message);
/***** 处理结束 *****/
//如果不需要错误处理,以上的处理过程都可省略
return Promise.resolve(error.response);
}
);
function redirectLogin() {
Router.push('/login');
}
export default service;
/* eslint-disable comma-dangle */
import request from './request';
import requestDown from './requestUp';
const http = {
/**
* methods: 请求
* @param url 请求地址
* @param params 请求参数
*/
get(url, params, headers) {
const config = {
method: 'get',
url,
};
if (params) config.params = params;
if (headers) config.headers = headers;
return request(config);
},
post(url, params, headers) {
const config = {
method: 'post',
url,
};
if (params) config.data = params;
if (headers) config.headers = headers;
return request(config);
},
put(url, params) {
const config = {
method: 'put',
url,
};
if (params) config.data = params;
return request(config);
},
delete(url, params) {
const config = {
method: 'delete',
url,
};
if (params) config.data = params;
return request(config);
},
upload(url, params) {
const config = {
method: 'post',
url,
headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' },
};
if (params) config.data = params;
return requestDown(config);
},
};
export default http;
let envBase;
switch (process.env.API_ENV) {
case 'prd':
envBase = {
baseURL: 'XXXXXXX',
};
break;
case 'uat':
envBase = {
baseURL: 'XXXXXXX',
};
break;
case 'dev':
envBase = {
baseURL: 'XXXXXXX',
};
break;
case 'mock':
envBase = {
baseURL: 'XXXXXXX',
};
break;
default:
envBase = {
baseURL: '',
};
}
export default envBase;
import Http from '@/services/config/http.js';
const app = createApp(App);
app.config.globalProperties.$http = Http;
//使用时
const { proxy } = getCurrentInstance();
proxy.$http
.get('XXX')
.then((res) => {})
.catch(() => {});