1、Axios 拦截器的两种类型
请求拦截器(Request Interceptor),在请求发送前处理,如添加认证 token、修改 headers
。响应拦截器(Response Interceptor),在响应数据到达后处理,如统一处理错误码、简化响应结构。
import axios from 'axios'
// 创建实例
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 5000
})
// 请求拦截器
api.interceptors.request.use(
config => {
// 例如:添加 token
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
error => {
return Promise.reject(error)
}
)
// 响应拦截器
api.interceptors.response.use(
response => {
// 只返回数据部分
return response.data
},
error => {
// 统一处理错误
if (error.response) {
switch (error.response.status) {
case 401:
alert('未授权,请登录')
break
case 500:
alert('服务器错误')
break
default:
alert(`错误:${error.response.statusText}`)
}
} else {
alert('网络连接失败')
}
return Promise.reject(error)
}
)
export default api
2、使用场景
1)添加 token
请求拦截器中为 header
添加认证信息。
import axios from 'axios'
// 创建 Axios 实例
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 5000
})
// 添加请求拦截器
api.interceptors.request.use(
config => {
// 从本地存储中获取 Token
const token = localStorage.getItem('token')
// 如果存在 Token,则添加到请求头
if (token) {
config.headers.Authorization = `Bearer ${token}`
// 或者根据后端需求写成:
// config.headers['Authorization'] = 'Bearer ' + token
}
return config
},
error => {
// 请求错误处理
return Promise.reject(error)
}
)
export default api
2)loading 状态控制
import axios from 'axios'
// 模拟 loading 控制器(你可以换成自己项目的 loading 组件)
const loading = {
show: () => console.log('🔄 loading...'),
hide: () => console.log('✅ done')
}
// 创建 Axios 实例
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 5000
})
// 请求拦截器:发出请求前启动 loading
api.interceptors.request.use(
config => {
loading.show()
return config
},
error => {
loading.hide()
return Promise.reject(error)
}
)
// 响应拦截器:无论成功或失败都关闭 loading
api.interceptors.response.use(
response => {
loading.hide()
return response.data
},
error => {
loading.hide()
return Promise.reject(error)
}
)
export default api
3)错误统一提示
响应拦截器中处理错误状态码。
import axios from 'axios'
// 假设有一个统一的弹窗/提示函数(可换成 Element Plus 的 ElMessage、AntD 的 message.error 等)
const showError = (msg) => {
console.error(`❌ 错误提示:${msg}`)
// 你可以换成 UI 库的方法,比如:
// ElMessage.error(msg)
// message.error(msg)
}
// 创建 Axios 实例
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 5000
})
// 响应拦截器
api.interceptors.response.use(
response => {
return response.data
},
error => {
if (error.response) {
const { status, data } = error.response
// 常见状态码统一处理
switch (status) {
case 400:
showError(data.message || '请求参数错误')
break
case 401:
showError('未授权,请重新登录')
// 可重定向到登录页
break
case 403:
showError('没有权限访问')
break
case 404:
showError('请求地址不存在')
break
case 500:
showError('服务器内部错误')
break
default:
showError(data.message || `错误:${status}`)
}
} else {
showError('网络连接失败,请检查网络')
}
return Promise.reject(error)
}
)
export default api