二次封装axios和二次封装拦截器

1. 二次封装 axios

定义

axios 进行全局配置和功能扩展,创建一个符合项目需求的 HTTP 客户端实例。

核心目的

  • 统一配置请求基础路径、超时时间、请求头格式等。
  • 集成项目特定的功能(如错误处理、请求重试、日志记录等)。
  • 简化 API 调用方式,提供更友好的接口。

实现方式

创建一个 axios 实例并导出,通常在 utils/request.js 或类似文件中:

javascript 复制代码
// utils/request.js
import axios from 'axios';

const service = axios.create({
  baseURL: 'https://api.example.com', // 基础 API 路径
  timeout: 5000,                       // 请求超时时间
  headers: {
    'Content-Type': 'application/json',
  },
});

// 这里可以添加拦截器(但不是必须的)
service.interceptors.request.use(
  (config) => {
    // 请求前处理(如添加 token)
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 导出封装后的 axios 实例
export default service;

使用示例

javascript 复制代码
import request from '@/utils/request';

// 直接使用封装后的实例发送请求
request.get('/users').then((res) => {
  console.log(res.data);
});

2. 二次封装拦截器

定义

axios 的请求拦截器(request interceptor)和响应拦截器(response interceptor)进行封装,用于统一处理请求前和响应后的逻辑。

核心目的

  • 请求拦截器:在请求发送前添加通用处理(如添加认证 token、请求参数格式化、请求日志记录等)。
  • 响应拦截器:在响应返回后统一处理(如状态码校验、错误提示、数据格式化等)。

实现方式

通常在封装 axios 实例时添加拦截器,或单独创建拦截器模块:

javascript 复制代码
// utils/interceptors.js
import { ElMessage } from 'element-plus'; // 示例:使用 Element UI 的消息提示

// 请求拦截器
export const setupRequestInterceptors = (instance) => {
  instance.interceptors.request.use(
    (config) => {
      // 添加 token
      const token = localStorage.getItem('token');
      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }
      return config;
    },
    (error) => {
      return Promise.reject(error);
    }
  );
};

// 响应拦截器
export const setupResponseInterceptors = (instance) => {
  instance.interceptors.response.use(
    (response) => {
      // 成功响应(状态码 2xx)的统一处理
      const { code, message, data } = response.data;
      if (code !== 200) {
        ElMessage.error(message || '请求失败');
        return Promise.reject(new Error(message || '请求失败'));
      }
      return data; // 直接返回 data 字段,简化后续使用
    },
    (error) => {
      // 错误响应的统一处理
      const status = error.response?.status;
      switch (status) {
        case 401:
          ElMessage.error('未登录,请重新登录');
          // 跳转到登录页
          break;
        case 403:
          ElMessage.error('权限不足');
          break;
        case 500:
          ElMessage.error('服务器内部错误');
          break;
        default:
          ElMessage.error('网络错误,请重试');
      }
      return Promise.reject(error);
    }
  );
};

使用示例

javascript 复制代码
// utils/request.js
import axios from 'axios';
import { setupRequestInterceptors, setupResponseInterceptors } from './interceptors';

const service = axios.create({
  baseURL: 'https://api.example.com',
});

// 应用拦截器
setupRequestInterceptors(service);
setupResponseInterceptors(service);

export default service;

3. 主要区别对比

对比项 二次封装 axios 二次封装拦截器
核心功能 创建一个定制化的 axios 实例,包含全局配置 统一处理请求前和响应后的逻辑
关注点 基础配置、请求方式简化、项目特定功能集成 请求/响应的预处理和后处理
实现位置 通常在 axios 实例创建时配置 作为独立模块或在 axios 实例中配置
常见应用场景 - 设置 baseURL、超时时间 - 集成请求重试逻辑 - 统一错误处理 - 添加认证 token - 状态码校验 - 响应数据格式化 - 错误提示
是否依赖对方 可以独立存在,但通常会包含拦截器配置 依赖 axios 实例,需在实例上注册

4. 最佳实践建议

  1. 结合使用

    通常在二次封装 axios 时会同时封装拦截器,二者结合可以实现更完善的 HTTP 客户端。

  2. 拦截器模块化

    将拦截器逻辑单独封装为模块(如 interceptors.js),提高代码可维护性。

  3. 错误处理统一化

    在响应拦截器中统一处理 HTTP 错误和业务错误,避免在每个 API 调用处重复处理。

  4. 灵活配置

    允许通过环境变量或配置文件动态调整 axios 实例的参数(如 baseURL)。

相关推荐
一只小风华~2 分钟前
Vue:条件渲染 (Conditional Rendering)
前端·javascript·vue.js·typescript·前端框架
柯南二号4 分钟前
【大前端】前端生成二维码
前端·二维码
程序员码歌33 分钟前
明年35岁了,如何破局?说说心里话
android·前端·后端
博客zhu虎康1 小时前
React Hooks 报错?一招解决useState问题
前端·javascript·react.js
灰海2 小时前
vue中通过heatmap.js实现热力图(多个热力点)热区展示(带鼠标移入弹窗)
前端·javascript·vue.js·heatmap·heatmapjs
王源骏2 小时前
LayaAir鼠标(手指)控制相机旋转,限制角度
前端
大虾写代码2 小时前
vue3+TS项目配置Eslint+prettier+husky语法校验
前端·vue·eslint
wordbaby3 小时前
用 useEffectEvent 做精准埋点:React analytics pageview 场景的最佳实践与原理剖析
前端·react.js
上单带刀不带妹3 小时前
在 ES6 中如何提取深度嵌套的对象中的指定属性
前端·ecmascript·es6
excel3 小时前
使用热力贴图和高斯函数生成山峰与等高线的 WebGL Shader 解析
前端