Axios的二次封装

完整的 axios.js 封装

这个 axios.js 文件封装了:

  • 请求拦截器 (添加 token 到请求头)
  • 响应拦截器(统一错误处理)
  • 支持取消请求AbortController
  • 动态 baseURL(根据环境自动切换)
  • 超时时间(防止请求卡死)

📌 axios.js 封装

javascript 复制代码
import axios from 'axios';

// 1️⃣ 动态 baseURL 配置
const BASE_URL = process.env.NODE_ENV === 'production' 
  ? 'https://api.prod.com'  // 生产环境
  : 'http://localhost:3000'; // 开发环境

// 2️⃣ 创建 Axios 实例
const createService = () => {
  const controller = new AbortController(); // 取消请求控制器
  const service = axios.create({
    baseURL: BASE_URL,  // 设置 baseURL
    timeout: 10000,     // 超时时间(10s)
    signal: controller.signal, // 绑定取消请求信号
    headers: {
      'Content-Type': 'application/json' // 默认 JSON 格式
    }
  });

  // 3️⃣ 请求拦截器
  service.interceptors.request.use(
    config => {
      const token = localStorage.getItem('token'); // 获取 Token
      if (token) {
        config.headers.Authorization = `Bearer ${token}`; // 统一携带 Token
      }
      return config;
    },
    error => {
      return Promise.reject(error);
    }
  );

  // 4️⃣ 响应拦截器
  service.interceptors.response.use(
    response => {
      return response.data; // 直接返回数据,省去 `data`
    },
    error => {
      if (error.response) {
        const status = error.response.status;
        switch (status) {
          case 401:
            console.error('未授权,请重新登录');
            localStorage.removeItem('token'); // 清除 token
            break;
          case 403:
            console.error('禁止访问');
            break;
          case 404:
            console.error('请求地址不存在');
            break;
          case 500:
            console.error('服务器错误');
            break;
          default:
            console.error('请求失败');
        }
      } else {
        console.error('网络异常');
      }
      return Promise.reject(error);
    }
  );

  return { service, controller };
};

// 导出封装好的 axios 实例
export default createService;

📌 如何在项目中使用

✅ 方式 1:发送 GET 请求

javascript 复制代码
import createService from './axios';

const { service } = createService();

service.get('/users')
  .then(data => console.log(data))
  .catch(error => console.error(error));

✅ 方式 2:发送 POST 请求

javascript 复制代码
import createService from './axios';

const { service } = createService();

service.post('/users', { name: 'Alice', age: 25 })
  .then(data => console.log(data))
  .catch(error => console.error(error));

✅ 方式 3:取消请求

javascript 复制代码
import createService from './axios';

// 组件加载时发起请求
const { service, controller } = createService();

service.get('/users')
  .then(data => console.log(data))
  .catch(error => console.error(error));

// 取消请求(比如在用户离开页面时)
setTimeout(() => {
  controller.abort();
  console.log('请求已取消');
}, 2000);

📌 总结

功能 代码封装
动态 baseURL process.env.NODE_ENV 自动切换
请求超时 timeout: 10000
请求拦截器 统一携带 token
响应拦截器 统一错误处理
支持取消请求 AbortController 取消请求

这样,我们的 axios 封装更加模块化、可维护、可扩展!🚀

相关推荐
萧鼎1 分钟前
Python WebSockets 库详解:从基础到实战
开发语言·python
长潇若雪4 分钟前
《STL 六大组件之容器篇:简单了解 list》
开发语言·c++·经验分享·list·类和对象
洁洁!13 分钟前
数据采集助力AI大模型训练
前端·人工智能·easyui
MiyueFE22 分钟前
bpmn-js 源码篇9:Moddle - 对象格式的标准化定义库
前端·javascript
西元.24 分钟前
线程等待与唤醒的几种方法与注意事项
java·开发语言
excel28 分钟前
webpack 核心编译器 七 节
前端
独好紫罗兰32 分钟前
洛谷题单2-P5717 【深基3.习8】三角形分类-python-流程图重构
开发语言·python·算法
落榜程序员33 分钟前
Java基础-25-继承-方法重写-子类构造器的特点-构造器this的调用
java·开发语言
一只月月鸟呀35 分钟前
HTML中数字和字母不换行显示
前端·html·css3
forestsea39 分钟前
Java 应用程序CPU 100%问题排查优化实战
java·开发语言