封装 Axios 是指将 Axios 这个 HTTP 客户端库进行封装,以便在项目中更方便地使用和管理网络请求。在封装 Axios 时,一般会定义一些公共的配置、拦截器、错误处理等功能,以提高代码的复用性和可维护性。
这里vue模板重新封装 axios (src/utils/request.js 路径)主要做三件事:
1. 基础地址,超时时间
2.请求拦截器,统一注入 token
3. 响应拦截器,结构函数,处理异常
/**
* 封装 axios
* 1. 基础配置 : 基础地址、超时时间
* 2. 请求拦截器 : 统一注入token
* 3. 响应拦截器 : 结构数据,处理异常
*/
import axios from 'axios'
import store from '@/store'
import { Message } from 'element-ui'
import router from '@/router'
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // 基础地址
timeout: 20000
}) // 创建一个新的axios实例
// 成功1 失败2
service.interceptors.request.use((config) => {
// 注入token
// this.$store.getters
// store.getters.token => 请求头里面
if (store.getters.token) {
// Authorization 字段是后端规定的
config.headers.Authorization = `Bearer ${store.getters.token}`
}
return config
}, (error) => {
// 失败执行promise
return Promise.reject(error)
})
// 响应拦截器
service.interceptors.response.use((response) => {
if (response.data instanceof Blob) {
return response.data // 返回 Blob 对象
}
// axios默认包裹了data
const { data, message, success } = response.data
if (success) {
return data
} else {
Message({ type: 'error', message })
return Promise.reject(new Error(message))
}
}, async (error) => {
// error.message
if (error.response.status === 401) {
// 如果状态码等于401,说明 token 失效了
Message({
type: 'warning',
message: '登录失效了,请重新登录'
})
await store.dispatch('user/logout') // 调用action 退出登录
// 跳转到首页
router.push('/login')
return Promise.reject(error)
}
Message({ type: 'error', message: error.message })
return Promise.reject(error)
})
export default service