详解Vue中AXIOS的封装

yizhihongxing

下面我将详细讲解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日

相关文章

  • redis批量写入与单key写入性能对比

    以下是关于“Redis批量写入与单key写入性能对比”的完整攻略,包括Redis批量写入和单key写入的介绍、性对比两个示例等。 Redis批量写入与单key写入 Redis是一种高性能的存数据库,支持多种数据结构操作。在Redis中,批量写入和单key写入是两种常见的写入方式。 Redis批量写入 Redis批量写是一次性写入多个键值对。在Redis中,可…

    other 2023年5月7日
    00
  • Spring注解开发生命周期原理解析

    下面我给您具体讲解一下“Spring注解开发生命周期原理解析”的完整攻略。 1. 什么是Spring注解开发生命周期? Spring框架核心IOC容器负责管理bean的生命周期,Spring提供了两种方式来管理bean的生命周期: 实现BeanFactoryAware接口来得到BeanFactory的引用 实现ApplicationContextAware接…

    other 2023年6月27日
    00
  • 前端JS图片懒加载原理方案详解

    前端JS图片懒加载原理方案详解 什么是图片懒加载? 图片懒加载指的是在网页的滚动过程中,将未出现在视窗内的图片延迟加载,等到图片即将进入到可视区域时再将其加载。相对于一开始就加载所有图片的方式,图片懒加载能很大程度地减少页面渲染时的负担,节省带宽资源。 为什么需要图片懒加载? 随着富媒体网站的发展,页面上的图片数量越来越多,而把所有图片一开始就加载出来很容易…

    other 2023年6月25日
    00
  • Win7系统玩英雄联盟经常自动关机的故障原因分析及解决方法

    Win7系统玩英雄联盟经常自动关机的故障原因分析及解决方法 问题描述 有些Win7系统用户在玩英雄联盟这款游戏时,经常会遇到电脑自动关机的情况,导致游戏无法正常进行,影响游戏体验。 分析原因 引起Win7系统玩英雄联盟经常自动关机的原因有很多,下面列出几种可能的情况: CPU过热:玩游戏时CPU会处于高负荷状态,导致CPU温度升高,过高的温度会让电脑自动关闭…

    other 2023年6月27日
    00
  • .Net创建型设计模式之建造者、生成器模式(Builder)

    .Net创建型设计模式之建造者、生成器模式(Builder) 生成器模式(Builder)是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离。通过使用生成器模式,可以逐步构建一个复杂对象,而不需要直接调用其构造函数或公共接口。 优点 将对象的构建过程与其表示分离,使得构建过程更加灵活和可控。 可以通过不同的生成器组合来构建不同的对象,提高代码的复用性…

    other 2023年10月15日
    00
  • Linux命令sed(流编辑器)的用法详解

    这里是“Linux命令sed(流编辑器)的用法详解”的完整攻略。 1. sed命令概述 sed是一种非交互式的流编辑器,用来处理文本文件。它一次读入一行文本,并将其送到一个处理序列中进行处理。可以对文本文件进行查找、替换、添加、删除等操作。 2. sed命令的基本格式 sed命令的基本格式如下: $ sed [选项] ‘command’ filename 其…

    other 2023年6月26日
    00
  • Element使用el-table组件二次封装

    接下来我将为您详细讲解Element使用el-table组件二次封装的完整攻略。 什么是el-table组件 el-table 是一个使用 vue.js 2.0 和 element-ui 组件库构建的高效、灵活的表格组件,可以满足大部分的表格展示需求。使用 el-table 可以更加方便地展示表格数据,并提供排序、分页、搜索和自定义模板等增强功能。 为什么要…

    other 2023年6月25日
    00
  • Golang二维切片初始化的实现

    Sure,下面是详细的讲解“Golang二维切片初始化的实现”的完整攻略。 什么是二维切片 切片是 Go 语言中的重要数据类型之一,二维切片则是指切片中每一个元素也是一个切片。例如:[][]int 表示一个 int 类型的二维切片。 二维切片初始化的方法 1. 静态分配初始化 使用静态数组初始化二维切片,可以明确知道二维切片的行数和列数。 package m…

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