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日

相关文章

  • Linux下NFS网络文件系统的基本使用教程

    Linux下NFS网络文件系统的基本使用教程 1. 简介 NFS(Network File System)是一种运行在TCP/IP协议之上,支持共享文件系统的协议,一般用于在局域网中共享文件。 2. 安装NFS 在Linux下,首先需要安装NFS服务端和NFS客户端,可以通过以下命令进行安装: sudo apt-get install nfs-kernel-…

    other 2023年6月27日
    00
  • 图片加载进度实时显示

    一、概述 在网页中加载图片是很常见的场景,但一些大图片、网络延迟等因素都会导致图片加载时间延长。在用户等待图片加载时,为了提升用户体验,可以通过实时显示图片加载进度来让用户了解当前图片加载的进度,从而缓解用户的焦虑感和等待时间。本文将详细介绍如何实现图片加载进度实时显示的功能。 二、实现方式 实时显示图片加载进度的方式一般有两种,分别是:使用canvas绘制…

    other 2023年6月25日
    00
  • Java 中的 this 和 super 区别

    Java 中的 this 和 super 关键字是面向对象编程非常重要的概念。它们的作用不同,但在一定程度上又有重叠。接下来我将详细讲解它们的区别。 this 关键字 this 关键字代表当前对象,它可以用于: 引用当前类中的成员变量或成员方法。 当构造函数的参数名和成员变量名相同时,用于区分两者,以便正确地初始化成员变量。 将当前对象作为参数传递给其他方法…

    other 2023年6月26日
    00
  • CSS z-index 层级关系优先级的概念

    CSS z-index 层级关系优先级的概念 在 CSS 中,我们可以使用 z-index 属性来控制元素的层级关系和显示顺序。通过设置不同的 z-index 值,我们可以指定元素在堆叠上下文中的显示优先级。 1. 基本原理 z-index 属性决定了一个元素在堆叠上下文中的显示顺序。具有较高 z-index 值的元素会覆盖那些具有较低 z-index 值的…

    other 2023年6月28日
    00
  • 解决执行maven命令时提示Process terminated的问题

    解决执行maven命令时提示Process terminated的问题,可以尝试以下几个方法: 1. 检查环境变量 检查Maven是否正确安装并在环境变量中配置。可以使用以下命令检查Maven是否正确配置: mvn -version 如果输出了Maven的版本信息,则说明Maven已经正确安装并在环境变量中配置了。如果没有输出,则需要重新安装或配置Maven…

    other 2023年6月27日
    00
  • 如何写出优美的C语言代码

    如何写出优美的C语言代码 写出优美的C语言代码,需要我们注意以下几个方面: 1. 代码结构清晰 代码结构应该有层次感,每一个模块应该有对应的头文件和源文件,函数名应该简洁明了,函数内部的代码应该有缩进,不要出现太长的一行代码。下面是一个示例: #include <stdio.h> int max(int a,int b) { return a&g…

    other 2023年6月27日
    00
  • short int、long、float、double使用问题说明

    下面是关于”short int、long、float、double使用问题说明”的完整攻略。 Short int、Long、Float、Double的使用问题说明 1. Short int Short int是一种数据类型,它是整数类型中最短的一种。其大小为16位,范围为-32768到32767。 在C语言中,Short int可以用关键字short或sig…

    other 2023年6月25日
    00
  • speechlib语音播报

    Speechlib语音播报 Speechlib是一个功能强大的语音播报工具,它可以让你的网站内容以语音的形式播报出来,给用户带来全新的观感体验。该工具采用HTML5的Web Speech API技术实现,因此支持多种语言、多种声音合成选项,使用非常简单。 安装 Speechlib的安装非常简单,只需要在页面中添加以下代码即可: <script src=…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部