axios封装—vue3项目


前言

axios的API很友好,可以在项目中直接使用。但是在大型项目中,http请求很多,且需要区分环境, 每个网络请求有相似需要处理的部分,会导致代码冗余,破坏工程的可维护性,扩展性,所以需要对axios请求进行相应的封装


正文

安装axios

# npm 安装
npm install axios
# yarn 安装
yarn add axios

封装请求api

1. 在src目录下新建个api目录,里面放请求相关的文件,新建request.js文件,首先引入axios
import axios from 'axios';
2. 创建一个axios实例
// request.js
// 创建新的axios实例
const service = axios.create({
    
    
  // 环境变量,需要在.env文件中配置
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时时间暂定5s
  timeout: 5000,
});
3. axios请求拦截器

config里面配置请求前的一些处理,例如:数据转化,配置请求头,设置token,设置loading等,根据需求去添加

// request.js
service.interceptors.request.use(
  config => {
    
    
  	// 此处添加Loading
    return config;
  },
  error => {
    
    
    return Promise.reject(error);
  }
);

接下来加入Loading,使用了vant组件的Toast提示,所以先引入vant,其他UI库同理

# Vue 3 项目,安装最新版 Vant
npm i vant
# 通过 yarn 安装
yarn add vant
// request.js
// 使用vant组件的Toast提示,import引入要放在项目最上方
import {
    
     showToast, showLoadingToast, closeToast, setToastDefaultOptions } from 'vant';
import 'vant/es/toast/style';
//显示持续时长
setToastDefaultOptions({
    
     duration: 3000 }); 

// loading 次数
let loadingCount = 0;

service.interceptors.request.use(
  config => {
    
    
    // 加入Loading
    showLoadingToast({
    
    
      message: '加载中...',
      //禁止背景点击
      forbidClick: true,
    });
    loadingCount++;
    return config;
  },
  error => {
    
    
    return Promise.reject(error);
  }
);
4. axios响应拦截器
// request.js
service.interceptors.response.use(
  response => {
    
    
    // 关闭loading
    loadingCount--;
    if (loadingCount === 0) {
    
    
      closeToast();
    }
    return response;
  },
  error => {
    
    
    closeToast();
    // 处理异常情况,根据项目实际情况处理或不处理
    if (error && error.response) {
    
    
      // 根据约定的响应码处理
      switch (error.response.status) {
    
    
        case 403:
          error.message = '拒绝访问';
          break;
        case 502:
          error.message = '服务器端出错';
          break;
        default:
          error.message = `连接错误${
      
      error.response.status}`;
      }
    } else {
    
    
      // 超时处理
      error.message = '服务器响应超时,请刷新当前页';
    }
    showToast(error.message);
    return Promise.resolve(error.response);
  }
);
5. 封装请求函数,可以根据项目实际情况处理参数(此处仅处理了get与post请求)
// request.js
const Request = (url, options = {
     
     }) => {
    
    
  let method = options.method || 'get';
  let params = options.params || {
    
    };
  
  if (method === 'get' || method === 'GET') {
    
    
    return new Promise((resolve, reject) => {
    
    
      service
        .get(url, {
    
    
          params: params,
        })
        .then(res => {
    
    
          if (res && res.data) {
    
    
            resolve(res.data);
          }
        })
        .catch(err => {
    
    
          reject(err);
        });
    });
  } else {
    
    
    return new Promise((resolve, reject) => {
    
    
      service
        .post(url, params)
        .then(res => {
    
    
          if (res && res.data) {
    
    
            resolve(res.data);
          }
        })
        .catch(err => {
    
    
          reject(err);
        });
    });
  }
};
6. 最后导出函数方法
// request.js
export default Request;

使用方式

1. 可以将接口全部定义在一个文件内(方便管理)

在request.js文件同级目录内新建index.js

// index.js
import http from './request';

export function getXXX() {
    
    
  return http('/api/get');
}

export function postXXX(params) {
    
    
  return http('/api/post', {
    
    
    method: 'POST',
    params: params,
  });
}

然后在项目中引入

import {
    
     getXXX, postXXX } from "./api/index";
getXXX().then(res => {
    
    
	// ...
});
let params = {
    
    
  pageNum: 1,
  pageSize: 10,
};
postXXX(params).then(res => {
    
    
	// ...
});
2. 另一种写法是直接在项目内使用
import http from "./api/request";

http('/api/get').then(res => {
    
    
	// ...
});

let params = {
    
    
  pageNum: 1,
  pageSize: 10,
};
http('/api/post', {
    
    
  method: 'POST',
  params: params,
}).then(res => {
    
    
	// ...
});;

总结

本文通过vue3+vant4的项目例子介绍了如何在项目里封装axios请求,其实vue2里面写法也类似,axios封装没有一个绝对的标准,需要结合项目中实际场景来设计。

如果此篇文章对您有帮助欢迎您【点赞】,也欢迎您【评论】+【收藏】!


扩展阅读

  1. Axios中文文档
  2. Vant4 Toast

猜你喜欢

转载自blog.csdn.net/m0_55119483/article/details/129686563