如何在Vue项目中封装axios

文章目录

一、axios简介

axios 是一个基于 XMLHttpRequest 的轻量级HTTP客户端,适用于浏览器和Node.js环境。它提供以下特性:

  • 创建XMLHttpRequests和HTTP请求
  • 支持 Promise API
  • 请求和响应拦截
  • 数据转换
  • 取消请求
  • 自动转换JSON数据
  • 客户端XSRF防御
    Vue 2.0起,官方推荐使用 axios 替代 vue-resource

基本使用

安装 axios

bash 复制代码
npm install axios --S

或通过CDN引入:

html 复制代码
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

在项目中导入并使用:

javascript 复制代码
import axios from 'axios';
axios({
  url: 'xxx',
  method: 'GET',
  params: {
    type: '',
    page: 1
  }
}).then(res => {
  console.log(res);
});

并发请求:

javascript 复制代码
axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (res1, res2) {
    // 处理响应
  }));

二、封装axios的原因

虽然 axios 的API设计友好,但随着项目规模增长,直接使用 axios 可能会导致以下问题:

  • 重复编写配置代码,如超时时间、请求头等。
  • 难以维护的冗余代码。
  • 缺乏统一的错误处理。
    因此,封装 axios 可以提高代码质量和可维护性。

三、封装axios的方法

1. 设置接口请求前缀

根据不同环境(开发、测试、生产)设置不同的请求前缀:

javascript 复制代码
if (process.env.NODE_ENV === 'development') {
  axios.defaults.baseURL = 'http://dev.xxx.com';
} else if (process.env.NODE_ENV === 'production') {
  axios.defaults.baseURL = 'http://prod.xxx.com';
}

vue.config.js 中配置代理转发以实现跨域:

javascript 复制代码
devServer: {
  proxy: {
    '/proxyApi': {
      target: 'http://dev.xxx.com',
      changeOrigin: true,
      pathRewrite: {
        '^/proxyApi': ''
      }
    }
  }
}

2. 设置请求头和超时时间

创建 axios 实例时,配置通用请求头和超时时间:

javascript 复制代码
const service = axios.create({
  timeout: 30000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
});

3. 封装请求方法

封装 GETPOST 请求方法,便于统一管理和使用:

javascript 复制代码
export function httpGet({ url, params = {} }) {
  return new Promise((resolve, reject) => {
    axios.get(url, { params }).then(res => resolve(res.data)).catch(err => reject(err));
  });
}
export function httpPost({ url, data = {}, params = {} }) {
  return new Promise((resolve, reject) => {
    axios({ url, method: 'post', data, params }).then(res => resolve(res.data)).catch(err => reject(err));
  });
}

将封装的方法放在 api.js 文件中,便于统一管理:

javascript 复制代码
import { httpGet, httpPost } from './http';
export const getorglist = (params = {}) => httpGet({ url: 'apps/api/org/list', params });

在页面中直接调用:

javascript 复制代码
import { getorglist } from '@/assets/js/api';
getorglist({ id: 200 }).then(res => {
  console.log(res);
});

4. 添加请求拦截器

在请求拦截器中添加通用逻辑,如设置token:

javascript 复制代码
axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  token && (config.headers.Authorization = token);
  return config;
}, error => Promise.reject(error));

5. 添加响应拦截器

在响应拦截器中处理通用错误和业务逻辑:

javascript 复制代码
axios.interceptors.response.use(response => {
  if (response.status === 200) {
    // 根据状态码处理业务逻辑
    return Promise.resolve(response.data);
  } else {
    return Promise.reject(response);
  }
}, error => {
  // 处理错误
  return Promise.reject(error);
});

小结

封装 axios 是提升项目代码质量的重要手段。合理的封装不仅能减少重复代码,还能提高代码的可维护性和可读性。封装方案应根据项目需求灵活设计。

相关推荐
IT_陈寒17 分钟前
JavaScript开发者必知的5个性能杀手,你踩了几个坑?
前端·人工智能·后端
跟着珅聪学java21 分钟前
Electron 精美菜单设计
运维·前端·数据库
日光倾21 分钟前
【Vue.js 入门笔记】闭包和对象引用
前端·vue.js·笔记
EstherNi23 分钟前
左右两侧定位的效果,vue3
javascript·vue.js
一只程序熊27 分钟前
UniappX 未找到 “video“ 组件,已自动当做 “view“ 组件处理。请确保代码正确,或重新生成自定义基座后再试。
前端
林小帅29 分钟前
【笔记】xxx 技术分享文档模板
前端
雾岛心情34 分钟前
【HTML&CSS】HTML为文字添加格式和内容
前端·css·html
心.c43 分钟前
如何在项目中减少 XSS 攻击
前端·xss
Rsun045511 小时前
Vue相关面试题
前端·javascript·vue.js
TON_G-T1 小时前
前端包管理器(npm、yarn、pnpm)
前端