Skip to content

axios 二次封装

在开发项目的时候避免不了与后端进行交互,因此我们需要使用axios插件实现发送网络请求。在开发项目的时候

我们经常会把axios进行二次封装。

  • 目的:
    • 使用请求拦截器,可以在请求拦截器中处理一些业务(开始进度条、请求头携带公共参数)

    • 使用响应拦截器,可以在响应拦截器中处理一些业务(进度条结束、简化服务器返回的数据、处理http网络错误)

axios 封装

文件结构

sh
project root/
    |-- src/
        |-- utils/
            |-- request.ts

request.ts 响应拦截器与请求拦截器

ts
// 引入 axios
import axios from 'axios'
import { ElMessage } from 'element-plus'
// 1. 利用axios 对象的 create 方法,创建axios 实例(基础路径,超时时间等)
const request = axios.create({
    // 基础路径上携带/api
    baseURL: import.meta.env.VITE_APP_BASE_API,
    // 超时
    timeout: 5000,
})
// 2. request 实例添加请求与响应拦截器
request.interceptors.request.use((config) => {
    // config 配置对象,headers 属性请求头,经常给服务器端携带公共参数
    // 返回配置对象
    return config
})

// 3. 响应拦截器
request.interceptors.response.use(
    (response) => {
        // 成功回调
        // 简化数据
        return response.data
    },
    (error) => {
        // 失败的回调:处理http 网络错误
        // 定义一个变量存储网络错误信息
        let message: string = ''
        // http 状态码
        let status: number = error.response.status

        switch (status) {
            case 401:
                message = 'Token 过期'
                break
            case 403:
                message = '无权限访问'
                break
            case 404:
                message = '资源未找到'
                break
            case 500:
                message = '服务器错误'
                break
            default:
                message = `未知错误: ${status}`
                break
        }
        // 提示错误信息
        ElMessage({
            type: 'error',
            message,
        })
        /* 在错误处理中,通常会返回 Promise.reject(error) 以便在调用链中继续处理错误,
        比如在页面中显示错误提示等。*/
        return Promise.reject(error)
    },
)

// 对外暴露
export default request