如何用axios封装网络请求?

19人浏览 / 0人评论 / 添加收藏

一、Axios的简介

Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js。
Axios 使用简单,包尺寸小且提供了易于扩展的接口。

二、封装Axios的好处

在前端的开发中,项目中我们往往需要将网络请求进行一定程度的封装,以满足我们的业务需求,更有利于我们的开发和维护,节省开发时间和提高效率。
在Vue项目中直接使用Axios存在以下问题:

多个组件重复编写相同的请求配置
缺乏统一的错误处理机制
难以维护和更新全局配置
无法快速切换不同环境接口地址
通过封装Axios可以实现:
✅ 统一管理接口地址
✅ 集中处理错误信息
✅ 添加全局Loading效果
✅ 简化组件中的使用方式
✅ 增强代码可维护性

三、完整封装实现步骤

本文以Vue3项目为例,进行实例讲解。

2.1 新建request.js文件,代码如下:

import axios from 'axios';

const instance = axios.create({
 baseURL: 'http://3.5.7.8:7001/context',
 timeout: 5000,
 headers: {
   'Content-Type': 'application/json',
 },
});

instance.interceptors.request.use(
 config => {
   const token = localStorage.getItem('token');
   if (token) {
     config.headers.Authorization = `Bearer ${token}`;
   }
   return config;
 },
 error => {
   return Promise.reject(error);
 }
);

instance.interceptors.response.use(
 response => {
   return response.data;
 },
 error => {
   if (error.response) {
     switch (error.response.status) {
       case 401:
         // 处理未授权
         break;
       case 404:
         // 处理未找到
         break;
       default:
         // 处理其他错误
     }
   }
   return Promise.reject(error);
 }
);

const http = {
 get: (url, params) => instance.get(url, { params }),
 post: (url, data) => instance.post(url, data),
 put: (url, data) => instance.put(url, data),
 delete: (url) => instance.delete(url),
 postFile: (url, data) => instance.post(url, data, {
   headers: {
       'Content-Type': 'multipart/form-data',
       // Authorization: `Bearer ${localStorage.getItem('token')}`
   }
 }),
};

export default http;

记得把baseURL修改为你自己的实际地址。

2.2 新建user.ts文件,代码如下:

/*
* @Author: wlx
* @Date: 2024-04-24 14:07:06
* @LastEditors: wlx
* @LastEditTime: 2024-06-14 16:17:41
* @Description: 用户相关的接口
*/
import http from '@/api/request';

// 详情
export const fetchUserInfo = (data: any) => http.post('/user/queryUser', data);

// 获取用户列表
export const listUser = (data: any) => http.post('/user/queryUserList', data);
// 新增用户
export const addUser = (data: any) => http.post('/user/addUser', data);

// 编辑用户
export const editUser = (data: any) => http.post('/user/editUser', data);
// 删除用户
export const deleteUser = (data: any) => http.post('/user/deleteUser', data);

// 更新用户头像
export const updateUserAvator = (data: any) => http.post('/user/updateUserAvatar', data);

2.3 在文件中引入:

import { fetchUserInfo, listUser, logout } from '@/api/user';

const userInfo = ref({});
onMounted(() => {
 getUserInfo(1);
});
const getUserInfo = (userId) => {
 try {
   let params = {
     id: userId,
   }
   console.log('params:', params)

   fetchUserInfo(params).then((res) => {
     let result = res.data; // 假设返回的数据在data属性中
     console.log('result:', result)
     if (result) {
         userInfo.value = result;
     }
   }).catch(() => {
     logout();
   });    
 } catch (error) {
   console.error('There was an error!', error);
 }
}

以上代码亲测有效,希望可以帮助到你。

 

全部评论