详解Vue中AXIOS的封装

下面我将详细讲解Vue中AXIOS的封装的完整攻略。

什么是AXIOS

AXIOS是一个基于promise的HTTP客户端,它可以用在浏览器和Node.js中,它最大的优点就是支持浏览器和Node.js的异步操作。

AXIOS的封装

在Vue中,我们通过封装AXIOS来发送HTTP请求。这样的好处是可以减少重复代码,在API接口调用的时候只需要关心传参和接口返回的数据即可,不需要过多的关心请求的具体实现方式。下面我们来看一个简单的场景:

假设现在要调用一个获取用户信息的接口:

接口地址: /api/user/info
请求方式: GET
请求参数:{
    userId: xxx
}
返回数据:{
    name: 'xiaoming',
    age: 18
}

下面将通过两个示例来讲解AXIOS的封装:

示例1:简单封装

我们可以新建一个request.js文件,对AXIOS进行封装:

import axios from 'axios'

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})

service.interceptors.request.use(
  config => {
    /* token鉴权 */
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

service.interceptors.response.use(
  response => {
    const res = response.data
    if (res.code !== 200) {
      /* error提示 */
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res.data
    }
  },
  error => {
    /* error提示 */
    return Promise.reject(error)
  }
)

export default service

在这个示例中,我们新建了一个service实例,设置了一些默认选项,如请求的基础URL和请求超时时间。

我们将请求拦截器和响应拦截器添加到AXIOS中,请求拦截器中可以实现对请求的预处理,比如在请求头中添加Token等处理;响应拦截器中可以生成统一的返回数据,对返回的数据进行过滤和Promise处理。

这里我们只是简单的实现了拦截器,需要鉴权的话可以在请求拦截器中处理,错误提示信息可以在响应拦截器中处理。

接下来我们在API接口中使用service即可:

import service from '请求的路径'

const getInfo = (userId) => {
  return service({
    url: '/api/user/info',
    method: 'get',
    params: {
      userId
    }
  })
}
export {
  getInfo
}

我们在API接口中,通过引入service来使用请求,再通过getInfo这个方法进行调用,传入参数即可。这个请求是基于Promise来实现的,所以我们可以通过.then或者.catch方法对请求进行处理。

示例2:进阶封装

上面的简单示例,虽然实现了基础的请求封装,但不能完全满足需求,有很多可优化的地方。

在进阶封装中,我们将在拦截器中添加更多的处理逻辑,比如请求头中添加Token、添加loading动画、错误处理。

import axios from 'axios'

/* 定义请求常量 */
const TIME_OUT = 5000;    // 请求超时时间
const ERR_OK = 200;       // 请求成功返回状态码
const ERR_NO_AUTH = 401;  // 未授权状态码
const ERR_FORBIDDEN = 403; // 禁止访问状态码
const ERR_NOT_FOUND = 404; // 指定访问地址不存在
const ERR_SERVER = 500;   // 服务器错误状态码
const ERR_BAD_GATEWAY = 502; // 网关错误状态码

/* 创建axios实例 */
let instance = axios.create({
    baseURL: process.env.VUE_APP_BASE_API, //根据环境设置 base_url
    timeout: TIME_OUT
});

/* 请求拦截器 */
instance.interceptors.request.use(config => {
    /* 添加请求头 */
    config.headers['Authorization'] = `Bearer ${getToken()}`; // 获取token
    /* 添加 loading 动画 */
    store.commit(SET_LOADING_STATUS, true);
    return config;
}, error => {
    return Promise.reject(error);
})

/* 响应拦截器 */
instance.interceptors.response.use(response => {
    store.commit(SET_LOADING_STATUS, false); //隐藏 loading 动画
    if(response.status === ERR_OK) {// 成功请求到数据
        if(response.data.code === ERR_OK) {//业务成功状态码
            return Promise.resolve(response.data)
        } else {// 业务失败状态码
            Message.error(response.data.message);
            return Promise.reject(response.data.message);
        }
    } else {// 请求状态错误
        Message.error('请求错误,请稍后再试');
        return Promise.reject(new Error('请求错误,请稍后再试'))
    }
}, error => { // 处理服务器响应流程错误 可根据需求自行调整
    store.commit(SET_LOADING_STATUS, false); // 隐藏 loading 动画
    const checkStatus = response => {
        store.commit(SET_LOADING_STATUS, false); // 隐藏 loading 动画
        /* 当响应异常时,提示并重定向 */
          switch (response.status) {
            case ERR_NO_AUTH:
              Message.error('你没有该权限,请联系管理员');
              break
            case ERR_FORBIDDEN:
              Message.error('登录失效,请重新登录');
              break
            case ERR_NOT_FOUND:
              Message.error('接口地址错误');
              break
            case ERR_SERVER:
              Message.error('服务器错误');
              break
            case ERR_BAD_GATEWAY:
              Message.error('服务器网关错误');
              break
            default:
              Message.error('未知错误');
        }
    }
    if(error.toString().indexOf('timeout') !== -1) { // 超时错误
        Message.error('请求超时,请稍后再试');
        return Promise.reject(new Error('请求超时,请稍后再试'))
    }
    const { response } = error;
    if(response) { // 处理异常状态码
        checkStatus(response);
        const { status, statusText } = response;
        return Promise.reject(new Error(`服务器${status}:${statusText}`));
    } else { // 处理断网
        Message.error('网络已断开');
        return Promise.reject(new Error('网络已断开'));
    }
});

在这个示例中,我们定义了一些请求的常量,包括请求超时时间和HTTP状态码,创建了instance实例,对其拦截器进行了完善的处理,包括请求头的处理、loading动画开启、错误处理。其中,通过store来管理loading动画状态,通过自定义Message来实现错误提示。

这样优化后的AXIOS实例可以更好的迁移至其他项目和解决较多复杂场景的请求需求。

我们仍然可以通过API接口使用并调用,在第一个示例中有详细的使用方式。

总结

AXIOS的封装可以大大减少项目中的重复代码,使得维护和迭代变得更加快捷。在拦截器中,我们可以对请求和响应进行更加详细的处理,比如Token鉴权、错误处理、loading动画等。上述的两个示例都是基于Vue和AXIOS的应用,实现了对AXIOS的简单封装和进阶封装。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Vue中AXIOS的封装 - Python技术站

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

相关文章

  • 深入理解链表的各类操作详解

    深入理解链表的各类操作详解 什么是链表 链表是一种数据结构,它由一连串的节点(node)组成。每个节点包含一个数据域和一个指针域。指针指向下一个节点,最后一个节点的指针为NULL。链表有单向链表、双向链表、循环链表等不同的形式。 下面我们会详细介绍链表的操作。 链表的创建 链表的创建分为两个步骤:创建头节点和向链表插入元素。 创建头节点 头节点是链表的第一个…

    other 2023年6月27日
    00
  • Win10最新预览版14393自制ISO镜像下载 32位/64位

    Win10最新预览版14393自制ISO镜像下载攻略 本攻略将详细介绍如何下载Win10最新预览版14393的自制ISO镜像,包括32位和64位版本。以下是具体步骤: 步骤一:准备工作 在开始之前,请确保您已经完成以下准备工作: 确认您的计算机符合Win10最新预览版14393的系统要求。 确保您有稳定的网络连接。 准备一个可用的USB闪存驱动器或空白的DV…

    other 2023年7月28日
    00
  • 顶点着色器详解(vertexshaders)

    顶点着色器详解 在图形学中,顶点着色器是一种重要的着色器类型,它用于控制渲染流水线中的顶点处理过程。本文将详细介绍顶点着色器的概念、作用、代码结构等方面的内容。 顶点着色器的概念 顶点着色器是在图形处理管线中的一个可编程流程,它的作用是将输入的几何数据转换成另一种形式,一般是3D空间中的顶点坐标。顶点着色器可以定义顶点的位置、颜色、法向量以及纹理坐标等属性,…

    其他 2023年3月29日
    00
  • matlab画图常用的符号和颜色

    以下是关于Matlab画图常用的符号和颜色的完整攻略,包含两个示例。 Matlab画图常用的符号和颜色 在Matlab中,我们可以使用不同的符号和颜色来区分不同的数据集或者不同曲线。以下是一些常用的符号和颜色: 符号 符号 描述 o 圆 + 十字 * 星号 s 正方形 d 菱形 ^ 上三角 v 下三角 < 左三角 > 右三角 颜色 颜色 描述 b…

    other 2023年5月9日
    00
  • CAD个性化操作快速自定义CAD标题栏方法图解

    这里为大家详细讲解如何进行“CAD个性化操作快速自定义CAD标题栏方法图解”的攻略。 1. 安装CUI工具 首先,我们需要安装CAD的CUI工具,这个工具是CAD的用户界面定制工具。在CAD软件中,我们可以通过CUI工具来自定义CAD的工具栏、菜单和命令等操作。 2. 进入CUI工具 打开CAD软件,在菜单栏中找到“工具”菜单,单击后选择“编辑用户界面”,即…

    other 2023年6月25日
    00
  • WIN11重置系统和重装有什么区别? win11重装系统对比重置系统介绍

    当你在使用Windows 11系统的时候,有时候会出现一些问题导致系统不稳定或者文件损坏,这时候我们需要对系统进行一些调整,以恢复它的正常运行。此时我们可以采用两种方法来解决问题:重置系统和重装系统。 重置系统 通过重置系统,我们可以重新设置系统,包括删除所有应用程序,文件和用户设置。然而,此操作并不会从计算机中删除操作系统及其相关文件。重置系统方法如下: …

    other 2023年6月20日
    00
  • mysql数据库表增添字段,删除字段,修改字段的排列等操作

    Mysql数据库表增添字段的操作 在已经创建的表中增加新的字段,使用 ALTER TABLE 语句,对于需要增加的字段,需要指定字段名称、数据类型、长度等信息。 mysql ALTER TABLE table_name ADD new_column_name column_definition; 示例: 在 users 表中添加 phone 字段,数据类型为…

    other 2023年6月25日
    00
  • Android通过应用程序创建快捷方式的方法

    Android 通过应用程序创建快捷方式的方法 为了让用户更方便快捷地使用应用程序,我们可以通过应用程序为其创建快捷方式。这篇攻略将介绍使用 Android API 创建快捷方式的方法。 1. 配置 AndroidManifest.xml 为了让应用程序能够接收创建快捷方式的请求,需要在 AndroidManifest.xml 中进行配置。在 applica…

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