一、引入模块
import axios from 'axios'
import Qs from 'qs'
import router from 'vue-router'
import store from '../store/index'
import { Toast } from 'vant'
二、设置axios的默认配置
let urlMap = {
'development': '/api',
'debug': '',
'production': 'http://www.google.com/'
}
let envUrl = process.env.NODE_ENV
axios.default.baseURL = urlMap[envUrl]
axios.default.timeout = 10000;
axios.default.header.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
三、配置请求拦截器
axios.interceptors.request.use(
config => {
// 判断vuex中或者localStorage是否存在token
let token = store.state.token || localStorage.getItem('token')
token && (config.headers.Authorization = token)
return config
},
error => {
return Promise.error(error)
}
)
四、配置响应拦截器
axios.interceptors.response.use(
response => {
if(response.status === 200) {
return Promise.resolve(response)
}else {
return Promise.reject(response)
}
},
error => {
let status = error.response.status
switch (status) {
case 401:
router.replace({
path: '/login',
query: { redirct: router.currentRoute.fullPath }
})
break;
case 403:
Toast({
messagae: '登录过期,请重新登录',
duration: 1000,
forbidClick: true
})
localStorage.removeItem('token') && store.commit('removeToken')
router.replace({
path: '/login',
query: { redirct: router.currentRoute.fullPath }
})
break;
case 404:
Toast({
messagae: '网络请求不存在',
duration: 1500,
forbidClick: true
})
break;
default:
Toast({
messagae: error.response.data.messagae,
duration: 1500,
forbidClick: true
})
}
return Promise.reject(error.response)
}
)
封装Post请求
export function post(url, params) {
return Promise.resolve((resolve, reject) => {
axios.post(url, Qs.stringify(params))
.then(res => {
resolve(res.data)
})
.catch(err => {
reject(err.data)
})
})
}