1、为了方便,设置baseURL地址,简化api地址
2、通过axios.defaults.timeout设置默认的请求超时时间。例如超过了10s,就会告知用户当前请求超时,请刷新等。
3、请求拦截:
// 请求拦截器
axios.interceptors.request.use(
config => {
// 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
const token = localStorage.getItem("token");
token && (config.headers.Authorization = "Bearer "+token);
return config;
},
error => {
return Promise.error(error);
})
一般在登陆完成后我们需要把token存到本地或是cookie里面,然后用户每次在进入页面的时候,首先从本地存储中读取token,如果token存在说明用户已经登陆过,然后,在每次请求接口的时候,都会在请求的header中携带token,后台人员就可以根据你携带的token来判断你的登录是否过期,如果没有携带,则说明没有登录过。
4、最后对后台返回的状态码进行统一管理,附上完整代码
import axios from 'axios';
import router from '../router/index';
import {
Message
} from 'element-ui'
function errorLog(err){
Message({
message:err.message,
type:'error',
duration:3000
})
}
axios.defaults.baseURL='http://####';
// 请求超时时间
axios.defaults.timeout = 10000;
// 允许携带cookie
axios.defaults.withCredentials = true;
// post请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
// 请求拦截器
axios.interceptors.request.use(
config => {
// 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
const token = localStorage.getItem("token");
token && (config.headers.Authorization = "Bearer "+token);
return config;
},
error => {
return Promise.error(error);
})
// response拦截器
axios.interceptors.response.use(
response => {
// dataAxios 是 axios 返回数据中的 data
const dataAxios = response.data
if (response.config.url == '/ad/ldap/login') {
if (response.headers['access-token']) {
response.data.token = response.headers['access-token']
}
}
// 这个状态码是和后端约定的
const {
code
} = dataAxios
// 根据 code 进行判断
if (code === undefined) {
// 如果没有 code 代表这不是项目后端开发的接口 比如可能是 Admin 请求最新版本
return dataAxios
} else {
// 有 code 代表这是一个后端接口 可以进行进一步的判断
switch (code) {
case 0:
// [ 示例 ] code === 0 代表没有错误
return dataAxios.data
case 'xxx':
// [ 示例 ] 其它和后台约定的 code
errorCreate(`[ code: xxx ] ${dataAxios.msg}: ${response.config.url}`)
break
default:
// 不是正确的 code
errorCreate(`${dataAxios.msg}: ${response.config.url}`)
break
}
}
},
error => {
if (error && error.response) {
switch (error.response.status) {
case 400:
error.message = '请求错误';
break
case 401: {
error.message = '未授权,请登录';
router.replace({
path: 'login',
query: {
redirect: router.currentRoute.path
},
})
// window.location.reload()
break
}
case 403:
error.message = '没有权限,拒绝访问';
break
case 404:
error.message = `请求地址出错`;
break
case 408:
error.message = '请求超时';
break
case 500:
error.message = '服务器内部错误';
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:
break
}
}
errorLog(error)
return Promise.reject(error)
}
)
export default axios;