vue中axios的二次封装实例讲解

yizhihongxing

这里详细讲解一下vue中axios的二次封装实例。

什么是axios?

axios 是一个基于 Promise 的 HTTP 客户端,可以用于浏览器和 node.js。axios 本身提供了更加简单易用的 API,能够一次性设置多余其他请求的默认值,同时也支持拦截器的使用。

为什么需要二次封装axios?

二次封装 axios 的主要原因在于:

  1. 业务中对请求响应进行统一处理,例如对错误响应的统一处理或者对成功响应的统一处理。这种情况下,我们可以通过封装 axios 来实现对响应的统一处理。
  2. 简化业务中的调用方式。当某个接口调用频率比较高时,如果每次都需要手动拼装请求参数,很容易出现疏漏,甚至浪费大量时间。这时候,我们可以通过封装 axios 来简化调用方式。

如何进行二次封装?

首先在 src 目录下新建一个 api 文件夹,用于存放项目中所有的接口。在这个文件夹下,我们新建一个 index.js 文件,用于封装 axios。

在 index.js 文件中,我们可以先进行 axios 的一些默认值设置和拦截器的设置:

import axios from 'axios';

axios.defaults.baseURL = 'http://localhost:8080/api';
axios.defaults.timeout = 10000;

// 添加请求拦截器
axios.interceptors.request.use(
  (config) => {
    // 在请求发送之前做一些处理
    let token = sessionStorage.getItem('token');
    if (token) {
      config.headers.Authorization = token;
    }
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
axios.interceptors.response.use(
  (response) => {
    // 对响应数据做处理
    return response.data;
  },
  (error) => {
    // 对响应错误做处理
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 未登录,跳转登录页
          router.replace({
            path: 'login',
            query: { redirect: router.currentRoute.fullPath }
          });
          break;
        case 500:
          // 服务器错误
          Message.error('服务器出错了,请稍后重试!');
          break;
      }
    }
    return Promise.reject(error);
  }
);

export default axios;

可以看到,在上面的代码中,我们设置了 axios 的默认 baseURLtimeout。同时,我们还添加了请求拦截器和响应拦截器。请求拦截器用于在发送请求之前做一些处理,例如在请求头中添加权限认证信息;响应拦截器用于在接收到响应数据后做一些处理,例如对响应数据进行格式化。

接下来,我们可以在 api 文件夹下新建一个 user.js 文件,用于封装用户相关的接口。在这个文件中,我们可以导入刚刚封装的 axios:

import axios from './index';

const userApi = {
  login(data) {
    return axios.post('/login', data);
  },
  logout() {
    return axios.post('/logout');
  }
};

export default userApi;

可以看到,在 user.js 文件中,我们直接使用了封装好的axios发送了一个 post 请求,并将请求结果直接返回。

至此,我们就完成了一次axios的二次封装,当我们在业务中需要请求某个接口时,只需要在对应的api文件中调用对应的方法即可,比如:

import userApi from '@/api/user';

export default {
  login() {
    userApi.login({
      username: 'admin',
      password: '123456'
    }).then(res => {
      console.log(res);
    }).catch(err => {
      console.log(err);
    });
  },
};

示例说明

示例一

例如,我们需要在发送请求时对 URL 进行拼接,可以在请求拦截器中进行处理:

axios.interceptors.request.use(
  (config) => {
    // 在请求发送之前做一些处理
    let token = sessionStorage.getItem('token');
    if (token) {
      config.headers.Authorization = token;
    }
    // 对 URL 进行拼接
    config.url = config.baseURL + '/' + config.url;
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

示例二

我们需要在成功响应后统一对响应结果进行处理,比如,某个接口每次调用时,都需要将返回结果中的时间戳转换成日期,并将转换后的日期格式化:

axios.interceptors.response.use(
  (response) => {
    // 对响应数据做处理
    let dateFilter = function (time) {
      let format = 'YYYY-MM-DD hh:mm:ss';
      let date = new Date(parseInt(time));
      let o = {
        'M+': date.getMonth() + 1,
        'D+': date.getDate(),
        'h+': date.getHours(),
        'm+': date.getMinutes(),
        's+': date.getSeconds()
      };
      format = format.replace(/y{4}/i, date.getFullYear()).replace(/y{2}/i, date.getFullYear() % 100).replace(/(M+|D+|h+|m+|s+)/g, (match) => {
        let value = o[match];
        return value < 10 ? '0' + value : value;
      });
      return format;
    };
    response.data.forEach(item => {
        item.time = dateFilter(item.time);
    });
    return response.data;
  },
  (error) => {
    // 对响应错误做处理
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 未登录,跳转登录页
          router.replace({
            path: 'login',
            query: { redirect: router.currentRoute.fullPath }
          });
          break;
        case 500:
          // 服务器错误
          Message.error('服务器出错了,请稍后重试!');
          break;
      }
    }
    return Promise.reject(error);
  }
);

在上述代码中,我们将 axios 自带的 response.data 转换成一个数组进行处理,然后按照业务需要格式化了接口返回的时间戳。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue中axios的二次封装实例讲解 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • javascript严格模式详解(含严格模式与非严格模式的区别)

    JavaScript严格模式详解(含严格模式与非严格模式的区别) 什么是严格模式? JavaScript严格模式(Strict Mode)是一种在JavaScript中运行代码的特殊模式。它通过限制一些不安全的语法和行为,提供更严格的错误检查,以帮助开发者编写更可靠、更规范的代码。 如何启用严格模式? 要启用严格模式,可以在脚本文件或函数的开头添加\”use…

    other 2023年8月8日
    00
  • 详解C++ 创建文件夹的四种方式

    详解C++ 创建文件夹的四种方式 在C++中创建一个文件夹一般有4种方式,分别是: 通过 Win32 API 函数 CreateDirectory 创建文件夹。 利用C++11标准库中 std::filesystem 的 create_directory 函数创建文件夹。 调用C++标准库中的 mkdir 函数创建文件夹。 使用操作系统的命令行窗口执行 mk…

    other 2023年6月26日
    00
  • Win10桌面窗口管理器占用大量CPU的解决办法?

    下面就来详细讲解一下“Win10桌面窗口管理器占用大量CPU的解决办法”。 首先,需要明确的是,桌面窗口管理器 (Desktop Window Manager, DWM)是Windows操作系统下的一个重要组成部分,它负责窗口的设计和管理,使得Windows操作系统拥有了现代化的用户界面。但是,在某些情况下,DWM可能会因为某些原因占用大量CPU资源,导致电…

    other 2023年6月26日
    00
  • uniapp监听某一元素距离顶部高度的变化

    Uniapp监听某一元素距离顶部高度的变化 在Uniapp开发中,我们经常需要实现以下功能:当滚动页面时,来判断某一元素是否已经进入可视区域。 HTML中有一个API可以判断元素是否进入可视区域,那就是getBoundingClientRect()方法,可以获取元素相对于视窗的位置,进而通过计算来判断元素是否已经进入可视范围。 下面是一个示例代码: <…

    其他 2023年3月29日
    00
  • Android仿今日头条多个fragment懒加载的实现

    实现Android仿今日头条多个fragment懒加载,需要用到Fragment中的ViewPager结合FragmentPagerAdapter。具体步骤如下: 1. 创建多个Fragment并加载到ViewPager中 首先,我们需要创建多个Fragment,并将它们加载到ViewPager中。可以通过使用FragmentPagerAdapter来实现。…

    other 2023年6月27日
    00
  • CCS进阶——div的宽度和高度是由什么决定的?

    CSS进阶——div的宽度和高度是由什么决定的? 介绍 CSS是构建网页的重要技术之一,其中的div元素被广泛使用。div元素允许我们将内容划分为不同的块,以达到更好的排版和布局效果。然而,对于初学者来说,div元素的宽度和高度的处理可能会带来一定的困难。那么,div的宽度和高度是由什么决定的呢? 宽度的决定 默认宽度 在未设置样式的情况下,div元素的默认…

    其他 2023年3月28日
    00
  • Vue2.x通用条件搜索组件的封装及应用详解

    让我们来详细讲解“Vue2.x通用条件搜索组件的封装及应用详解”。该攻略主要分为以下几个部分: 需求分析及设计组件结构 封装通用条件搜索组件 应用示例1:搜索员工信息 应用示例2:搜索图书信息 需求分析及设计组件结构 我们希望封装一个通用的搜索组件,能够支持多种类型的搜索条件。在进行实现前,我们需要对需求进行分析,来确定组件的设计结构。 我们希望该组件具有以…

    other 2023年6月25日
    00
  • win11如何设置右键关机? Win11右键菜单添加快速关机选项的技巧

    下面我将详细讲解“Win11如何设置右键关机?Win11右键菜单添加快速关机选项的技巧”。 1. 准备工作 在开始添加右键关机选项之前,需要进行以下准备工作: 确保你的系统是Win11。 确保你有管理员权限,如果没有,请使用管理员帐户登录。 确保你备份了重要文件,以防被误删或损坏。 2. 打开注册表编辑器 要添加右键关机选项,需要使用注册表编辑器进行操作。按…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部