vue中axios的封装问题(简易版拦截,get,post)

Vue中Axios的封装

Axios是基于Promise的HTTP库,适用于浏览器和Node.js平台,可以在Vue中使用Axios进行网络请求。在实际开发中,我们通常需要将Axios进行封装,使它更加符合我们的业务需求,提高代码的复用性和维护性。

Axios的封装目的

Axios的封装主要有以下几个目的:

  1. 方便统一处理网络请求的异常,如超时、401/403等错误状态码。
  2. 简化网络请求的调用方式,如定义API接口、封装get/post等请求方法。
  3. 提高代码的复用性和维护性,减少重复代码。

简单封装方法

下面是基于Axios简单封装的示例代码:

安装Axios

在使用Axios之前,需要先安装Axios库。可以使用npm或yarn来安装。

# 使用npm安装
npm install axios --save

# 使用yarn安装
yarn add axios

引入Axios并创建实例

在Vue中使用Axios,需要先引入Axios,并创建一个Axios的实例。

// 引入Axios
import axios from 'axios';

// 创建Axios实例
const instance = axios.create({
  // 设置请求超时时间
  timeout: 5000
});

封装get请求

在Axios的实例中,封装get请求非常简单,只需要对响应结果进行一次简单处理,即可返回数据。

/**
 * Get请求方法封装
 * @param url 请求地址
 * @param params 请求参数
 */
export const get = (url, params) => {
  return instance.get(url, { params })
    .then(response => {
      return response.data;
    })
    .catch(error => {
      console.error(`[Axios] GET请求出错: ${error}`);
      return Promise.reject(error);
    });
};

封装post请求

在Axios的实例中,封装post请求需要对请求头和请求体进行相应的设置。

/**
 * Post请求方法封装
 * @param url 请求地址
 * @param data 请求参数
 */
export const post = (url, data) => {
  return instance.post(url, data, {
    // 设置请求头类型
    headers: {
      'Content-Type': 'application/json',
    },
  })
  .then(response => {
    return response.data;
  })
  .catch(error => {
    console.error(`[Axios] POST请求出错: ${error}`);
    return Promise.reject(error);
  });
};

完整封装方法

对于复杂的业务场景,以上简单封装的方法可能已经不能满足要求,需要对Axios进行更完整的封装。

下面是更完整的封装示例代码:

异常拦截处理

// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 如需统一设置请求头
    // config.headers.Authorization = 'Bearer token';
    return config;
  },
  error => {
    console.error(`[Axios] 请求拦截器出错: ${error}`);
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  response => {
    const { data, status } = response;
    return {
      data,
      status,
    };
  },
  error => {
    console.error(`[Axios] 响应拦截器出错: ${error}`);
    const { response } = error;
    if (response) {
      const { status, data } = response;
      // 统一处理401/403等错误状态码
      if (status === 401 || status === 403) {
        console.error(`[Axios] 请求${response.url}出现了${status}错误`);
        return Promise.reject(error);
      } else {
        return Promise.reject(error);
      }
    } else {
      console.error(`[Axios] 请求${error.request.url}超时`);
      return Promise.reject(new Error('请求超时,请稍后重试!'));
    }
  }
);

API接口定义

const API_ROOT = 'http://localhost:8080/api';

export const API = {
  LOGIN: `${API_ROOT}/login`,
  LOGOUT: `${API_ROOT}/logout`,
  USERS_LIST: `${API_ROOT}/users/list`,
};

请求方法封装

/**
 * Get请求方法封装
 * @param url 请求地址
 * @param params 请求参数
 */
export const get = (url, params) => {
  return instance.get(url, { params })
    .then(response => {
      return response.data;
    })
    .catch(error => {
      console.error(`[Axios] GET请求出错: ${error}`);
      return Promise.reject(error);
    });
};

/**
 * Post请求方法封装
 * @param url 请求地址
 * @param data 请求参数
 */
export const post = (url, data) => {
  return instance.post(url, data, {
    // 设置请求头类型
    headers: {
      'Content-Type': 'application/json',
    },
  })
  .then(response => {
    return response.data;
  })
  .catch(error => {
    console.error(`[Axios] POST请求出错: ${error}`);
    return Promise.reject(error);
  });
};

/**
 * 登录接口封装
 * @param params 请求参数
 */
export const login = (params) => {
  return post(API.LOGIN, params);
};

/**
 * 登出接口封装
 */
export const logout = () => {
  return post(API.LOGOUT);
};

/**
 * 用户列表接口封装
 * @param params 请求参数
 */
export const userList = (params) => {
  return get(API.USERS_LIST, params);
};

示例1:使用封装后的get请求示例

import { userList } from '@/api/index';

export default {
  data() {
    return {
      users: [],
    };
  },
  mounted() {
    this.loadUsers();
  },
  methods: {
    loadUsers() {
      userList({})
        .then(data => {
          this.users = data;
        })
        .catch(error => {
          console.error(`获取用户列表出现了错误:${error.message}`);
        });
    },
  },
};

示例2:使用封装后的post请求示例

import { login } from '@/api/index';

export default {
  data() {
    return {
      username: '',
      password: '',
    };
  },
  methods: {
    submitForm() {
      const params = { username: this.username, password: this.password };
      login(params)
        .then(() => {
          this.$router.push({ name: 'Home' });
        })
        .catch(error => {
          console.error(`登录失败:${error.message}`);
        });
    },
  },
};

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue中axios的封装问题(简易版拦截,get,post) - Python技术站

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

相关文章

  • JavaScript 正则表达式备忘单实例代码

    JavaScript 正则表达式备忘单实例代码攻略 正则表达式是一种强大的工具,用于在字符串中匹配和操作文本模式。在 JavaScript 中,我们可以使用正则表达式来进行字符串匹配、替换、提取等操作。下面是一个详细的攻略,包含了一些常见的正则表达式示例代码。 1. 创建正则表达式 在 JavaScript 中,我们可以使用两种方式来创建正则表达式:使用字面…

    other 2023年8月18日
    00
  • mysql存数组的实例代码和方法

    要在 MySQL 中存储数组,可以使用 JSON 格式来存储。下面是一些示例代码和方法: 方法1:使用JSON字段存储数组 可以创建一个名为 items 的 JSON 字段来存储数组。例如,我们有一个名为 order 的表格,希望存储每个订单的商品列表。可以创建一个名为 items 的 JSON 字段来存储商品列表,并使用以下代码插入一行新记录: INSER…

    other 2023年6月25日
    00
  • flash怎么设计铅笔人拆分又组合的动画?

    首先,我们需要了解几个基础概念: 形状(Shape):包含了线条、填充和样式的图形对象。 画笔(Brush):用于绘制形状的工具,包括钢笔工具、直线工具、椭圆工具等。 描边(Stroke):绘制形状边缘的外边框。 填充(Fill):填充形状内部的颜色或图案。 运动(Motion):形状或对象的移动、旋转、缩放等。 动画(Animation):对形状或对象进行…

    other 2023年6月27日
    00
  • c#数组的排序

    C#数组的排序 在C#中,排序算法是最常用的算法之一,因为它可以用于操作各种类型的数据结构。 数组是其中一种最常见的数据结构,因此在本文中,我们将重点介绍如何在C#中对数组进行排序。 排序算法 在介绍如何对数组进行排序之前,我们需要先了解一下排序算法。 排序算法是计算机科学中最重要的算法之一。 它是指将一组元素按照特定的顺序排列的过程。 有多种不同的排序算法…

    其他 2023年3月28日
    00
  • Windows7关机、重启、待机、休眠命令通过Autohotkey可快速实现

    下面是详细讲解“Windows7关机、重启、待机、休眠命令通过Autohotkey可快速实现”的完整攻略: 1. Autohotkey是什么? Autohotkey是一个免费开源的脚本语言,可用于自动化任务、快捷键、时间戳、表单填充等许多任务。 2.如何安装Autohotkey? 在官网下载Autohotkey的安装包,安装后即可使用。 3.实现Window…

    other 2023年6月26日
    00
  • 浅谈java+内存分配及变量存储位置的区别

    浅谈Java内存分配及变量存储位置的区别 Java是一种面向对象的编程语言,它具有自动内存管理的特性。在Java中,内存分配和变量存储位置是非常重要的概念。本文将详细讲解Java中的内存分配和变量存储位置的区别,并提供两个示例来说明。 内存分配 在Java中,内存分配是指为对象或变量分配内存空间的过程。Java的内存分配主要分为栈内存和堆内存。 栈内存 栈内…

    other 2023年8月2日
    00
  • iOS复数cell下优雅的代码结构详解

    iOS复数cell下优雅的代码结构详解,主要是针对UITableView及其性能优化的一些技巧和建议。 一、为大型表格准备 1.1 使用复数section/cell 对于大型表格,我们通常会使用UITableViewCell的复用机制来避免出现性能问题。同时,使用复数的section/cell也能够让我们避免一个section/cell变得过于庞大。 举个例…

    other 2023年6月27日
    00
  • CMD命令行中cd命令使用方法

    当我们在使用 CMD 命令行操作时,经常需要切换当前目录。其中一个常用的命令就是 cd (change directory,改变目录)命令。 本文将会详细讲解 cd 命令在 CMD 命令行中的使用方法,包括常用的选项及其使用方法,并通过具体的示例演示如何使用 cd 命令切换目录。 基本用法 在 CMD 命令行中,使用 cd 命令可以切换当前工作目录。其基本语…

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