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