axios定制化设置请求响应拦截器,统一处理请求响应
设置拦截器的目的在于:可以定制化,设置请求头,公共api,超时时间。统一处理响应,对于前端获取的数据更加清晰。
配置axios,返回axios对象 request
// 设置默认请求头
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 注意:axios默认返回的就是promise
const service = axios.create({
//axios 请求中的公共url前缀。例如: /dev-api
baseURL: process.env.VUE_APP_BASE_API,
//请求超时时间
timeout: 15000
})
//设置request拦截器, config为传过来的参数对象
service.interceptors.request.use(config => {
// 在使用jwt的时候,发送请求时,需要设置定制化请求头
if (getToken()) {
//如果有token , 请求头中加上token
config.headers['Authorization'] = 'Bearer ' + getToken();
}
//get请求拼接params参数(query参数)
if (config.method === 'get' && config.params) {
let url = config.url + '?';
for (const key of Object.keys(config.params)) {
const value = config.params[key];
//使用encodeURIComponent,编码uri,特殊字符
const uriPart = encodeURIComponent(key) + '=';
if (value !== null && typeof (value) !== 'undefined') {
//如果value是对象,需要进一步解析
if (typeof (value) === 'object') {
for (const subKey of Object.keys(value)) {
let params = key + '[' + subKey + ']';
const subPart = encodeURIComponent(params) + "=";
url += subPart + encodeURIComponent(value[subKey]) + "&";
}
//如果value是普通值,直接拼接
} else {
url += uriPart + encodeURIComponent(value) + '&';
}
}
}
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
return config;
}, error => {
console.log(error);
Promise.reject(error);
})
//response响应拦截器
service.interceptors.response.use((response) => {
// 未设置状态码则默认成功状态
const code = response.data.code || 200;
// 获取错误消息
const msg = errorCode[code] || response.data.msg || errorCode['default'];
// 401 认证失败,密码或账号问题
if (code === 401) {
//弹出框提示
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
//需要清除token,用户退出日志记录等
store.dispatch('LogOut').then(() => {
//退出登入逻辑,去到登录页
location.href = "/login"
})
})
} else if (code === 500) {
//消息框提示
Message({
message: msg,
type: 'error'
})
//失败也需要返回promise对象哦!
return Promise.reject(new Error(msg));
} else if (code !== 200) {
Notification.error({
title: msg
})
//失败也需要返回promise对象哦!
return Promise.reject(new Error(msg));
} else {
// code === 200 只将对应数据返回
return response.data;
}
}, error => {
console.log('err' + error)
let {message} = error;
if (message == "Network Error") {
message = "后端接口连接异常";
} else if (message.includes("timeout")) {
message = "系统接口请求超时";
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
Message({
message: message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
})
发送请求,并处理。
export function getUser(){
return request({
url: '/captchaImage',
method: 'get'
})
}
getUser().then(res => {
}).catch(error=>{
});
我们发送请求时,接受到结果就不再需要判断code,直接处理成功或失败回调函数