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

这里详细讲解一下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日

相关文章

  • bat命令批处理判断32位还是64位系统的多种方法

    当使用批处理脚本编写时,可以使用多种方法来判断操作系统是32位还是64位。下面是一些常用的方法: 方法一:使用%PROCESSOR_ARCHITECTURE%环境变量 在Windows操作系统中,可以使用%PROCESSOR_ARCHITECTURE%环境变量来判断系统的位数。该环境变量的值为x86表示32位系统,值为AMD64表示64位系统。 以下是一个示…

    other 2023年7月28日
    00
  • 解析Java实现设计模式六大原则之里氏替换原则

    解析Java实现设计模式六大原则之里氏替换原则 什么是里氏替换原则 里氏替换原则,简称LSP(Liskov Substitution Principle),是面向对象设计中非常重要的一条原则。它的定义如下:如果对于每个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有对象o1都替换成o2时,程序P的行为没有发生变化,那么类型S是类型T…

    other 2023年6月26日
    00
  • python 递归相关知识总结

    下面我将从以下几个方面来详细讲解 “Python 递归相关知识总结”,以便让你对递归算法有更深入的理解: 什么是递归 递归的原理和实现方式 递归的应用场景 递归的优缺点 两个递归算法的示例说明 1. 什么是递归 递归是一种算法的实现方式,它是指在算法过程中调用自身的过程。递归在程序中的表现形式通常是一个函数调用它本身。一个递归过程通常包括两个部分:递归边界和…

    other 2023年6月27日
    00
  • 电脑鼠标右键点击图标闪退桌面重启该怎么办?

    针对“电脑鼠标右键点击图标闪退桌面重启该怎么办?”这个问题,我可以提供以下完整攻略: 第一步:排查是否是软件冲突引起的问题 打开任务管理器,查看是否有正在运行的和占用系统资源较高的软件。 备份电脑中重要数据并卸载可能与出现问题的程序有关的软件。例如,最近刚安装的软件或者最近更新的软件。如果卸载软件后问题解决,则该软件与问题有关。 第二步:尝试修复系统文件 打…

    other 2023年6月27日
    00
  • Mysql树形递归查询的实现方法

    MySQL树形递归查询是指在MySQL数据库中,通过递归查询的方式获取树形结构数据的方法。该方法可以用于实现维度表、组织架构表等具有树形结构的数据的查询。 以下是实现MySQL树形递归查询的具体步骤: 一、创建示例表 创建一张示例数据表,包含ID、名称、父ID等字段。例如: CREATE TABLE `category` ( `id` int(10) uns…

    other 2023年6月27日
    00
  • linux配置nexus

    Linux配置Nexus Nexus是一个功能强大的Maven项目仓库管理器。在Linux系统中安装和配置Nexus可以帮助我们更好地管理Maven构建过程中生成的各种依赖项和构建产品。在本文中,我们将学习如何在Linux系统中安装并配置Nexus。 步骤1:安装Java 在配置Nexus之前,首先需要安装Java。执行以下命令安装Java: sudo ap…

    其他 2023年3月28日
    00
  • office2007免费版在哪里下载?office2007破解版下载地址

    很抱歉,但我不能提供关于非法软件下载或破解的信息。这种行为侵犯了软件的版权,并且违反了法律法规。我鼓励您遵守法律,购买正版软件或使用免费的合法替代品。 如果您需要使用办公软件,我可以为您提供一些合法的选择。以下是两个示例: Microsoft Office Online:您可以在Microsoft Office Online上免费使用基本的Office功能。…

    other 2023年8月4日
    00
  • intellijidea2018激活

    以下是关于“IntelliJ IDEA 2018激活”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 IntelliJ IDEA是一款由JetBrains开发的Java集成开发环境(IDE),它提供了丰富的功能和工具,帮助开发人员更高地开发Java应用程序。IntelliJ IDEA 2018是IntelliJ IDEA的一个版本,它在2018年发布。…

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