Axios封装实战:Vue2高效HTTP请求

什么是Axios?

Axios是一个基于Promise的HTTP客户端库,专门用于浏览器和Node.js环境。它具有同构特性,意味着同一套代码可以在浏览器和Node.js中运行------在服务端使用原生Node.js http模块,在客户端使用XMLHttpRequests。

Axios核心特性

  • Promise API支持‌:使用Promise管理异步请求,告别传统callback方式
  • 请求/响应拦截器‌:在请求发送前和响应返回后进行统一处理
  • 自动JSON转换‌:自动将请求和响应数据转换为JSON格式
  • 取消请求功能‌:支持取消正在进行的请求
  • XSRF防御‌:客户端支持跨站请求伪造防御
  • 并发请求处理‌:支持多个并行请求的统一管理

在Vue项目中,合理封装Axios能够统一处理请求配置、错误处理和权限验证,大幅提升开发效率和代码可维护性。

Vue2中的Axios封装

1. 基础安装与配置

首先安装Axios依赖:

javascript 复制代码
npm install axios -S

2. 创建Axios实例

src/api/axios.js中创建配置化的Axios实例:

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

// 创建Axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // API基础地址
  timeout: 5000, // 请求超时时间
  headers: {
    'X-Custom-Header': 'foobar'
  }
});

3. 拦截器配置

请求拦截器‌用于在发送请求前统一处理配置:

javascript 复制代码
// 请求拦截器
service.interceptors.request.use(
  config => {
    // 添加认证token
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

响应拦截器‌用于统一处理服务器返回的数据:

javascript 复制代码
// 响应拦截器
service.interceptors.response.use(
  response => {
    // 对响应数据做统一处理
    return response.data;
  },
  error => {
    // 统一错误处理
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 未授权,跳转登录页
          router.push('/login');
          break;
        case 404:
          console.error('请求的资源不存在');
          break;
        default:
          console.error('请求失败', error.response.data);
      }
    }
    return Promise.reject(error);
  }
);

4. API接口统一管理

src/api/index.js中统一管理所有接口:

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

// 用户相关接口
export const userAPI = {
  // 用户登录
  login: (data) => service.post('/user/login', data),
  
  // 获取用户信息
  getUserInfo: (id) => service.get(`/user/${id}`),
  
  // 更新用户信息
  updateUser: (id, data) => service.put(`/user/${id}`, data),
  
  // 删除用户
  deleteUser: (id) => service.delete(`/user/${id}`)
};

// 文章相关接口
export const articleAPI = {
  getList: (params) => service.get('/articles', { params }),
  create: (data) => service.post('/articles', data),
  update: (id, data) => service.patch(`/articles/${id}`, data)
};

5. 在Vue2组件中

javascript 复制代码
import { userAPI, articleAPI } from '@/api';

export default {
  data() {
    return {
      userInfo: null,
      articles: []
    };
  },
  methods: {
    async login() {
      try {
        const result = await userAPI.login({
          username: 'admin',
          password: '123456'
        });
        this.userInfo = result.data;
      } catch (error) {
        console.error('登录失败', error);
      }
    },
    
    async loadArticles() {
      const result = await articleAPI.getList({
        page: 1,
        limit: 10
      });
      this.articles = result.data;
    }
  },
  mounted() {
    this.loadArticles();
  }
};
相关推荐
JustHappy5 小时前
古法编程秘籍(七):互联网到底是什么?把两台电脑怎么说话搞懂就够了
前端·后端·网络协议
老毛肚5 小时前
jeecg-boot-base-core 02 day
javascript·python
snow@li5 小时前
SEO-文章标题:写文章时候,分类+主标题+大纲+解释 作为标题 / 不点进去也知道全文覆盖什么 / 标题即架构
前端
kyriewen6 小时前
Git Commit 前自动修复代码风格?配置 Husky + lint-staged,从此 CR 只聊逻辑
前端·git·面试
岁月宁静7 小时前
RAG 文档摄入全链路,从原理到生产落地
vue.js·人工智能·python
小和尚同志7 小时前
AI 自动化测试探索(一):Playwright MCP
前端·人工智能·aigc
老马识途2.07 小时前
在AI的帮助下理解spring的启动过程
java·前端·spring
徐小夕7 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
运筹vivo@8 小时前
Python ContextVar 底层机制与内存模型拆解
前端·数据库·python
#麻辣小龙虾#9 小时前
基于vue3.0开发一款【固废与废气运维管理系统】(支持源码)
前端·vue.js·vue3