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日

相关文章

  • Win10重启后系统如何自动还原之前状态?

    Win10重启后系统如何自动还原之前状态? 在Windows 10中,我们可以通过“系统还原”功能来还原计算机到之前的状态,但很多人可能不知道,在Windows 10中还有一种更高级的功能,可以在系统重启后自动还原系统状态,这个功能叫“重置保护”。下面我将详细讲解“重置保护”的设置和使用方法。 开启并配置重置保护 打开“设置”,点击“更新和安全”。 在“更新…

    other 2023年6月27日
    00
  • 7-Zip(64位)如何设置层叠右键菜单?7-Zip设置层叠右键菜单教程

    下面是详细的”7-Zip设置层叠右键菜单教程”攻略: 1. 下载7-Zip(64位)程序并安装 首先我们需要在官网下载7-Zip(64位)程序并安装:https://www.7-zip.org/ 2. 打开7-Zip程序并设置 打开7-Zip程序,选择“选项”菜单。 在选项窗口中选择“7-Zip”选项卡。 在“7-Zip文件管理器”部分中,勾选“在上下文菜单…

    other 2023年6月27日
    00
  • Redis在windows下安装与配置

    Redis是一款高性能的键值对存储数据库,常用于缓存、消息队列等场景。在Windows下安装和配置Redis相对于Linux来说稍微有些麻烦,但是也不是很难。下面是Redis在Windows下安装和配置的完整攻略。 安装Redis 下载Redis 在Redis官网下载页面(https://redis.io/download)下载最新的Redis稳定版,选择W…

    other 2023年5月5日
    00
  • java算法题解LeetCode35复杂链表的复制实例

    Java算法题解LeetCode35复杂链表的复制实例 题目描述 给定一个链表,除了正常的next指针外,还有一个额外的指针random指向链表中的任意一个节点或者null。请返回这个链表的深度复制。 例如,给定链表1->2->3->4->null,random指针可能指向链表中的任意一个节点,也可能指向null。 解题思路 方法一:…

    other 2023年6月27日
    00
  • ios7.1 beta5固件下载:苹果ios7.1 beta5固件下载地址汇总介绍

    iOS 7.1 Beta 5固件下载攻略 苹果公司发布了iOS 7.1 Beta 5固件,这是一个测试版本,提供给开发者和测试人员使用。本攻略将详细介绍如何下载iOS 7.1 Beta 5固件,并提供下载地址汇总。 步骤一:注册为苹果开发者 在下载iOS 7.1 Beta 5固件之前,您需要注册为苹果开发者。请按照以下步骤进行注册: 访问苹果开发者网站(ht…

    other 2023年8月4日
    00
  • WPS Office Pro2016专业增强版详细安装激活教程(附序列号)

    WPS Office Pro2016专业增强版详细安装激活教程 WPS Office Pro2016专业增强版是一款功能强大的办公软件,在安装和激活过程中需要注意以下几个步骤。 步骤一:下载安装WPS Office Pro2016专业增强版 在官方网站(http://www.wps.cn/)上下载WPS Office Pro2016专业增强版安装包。下载完成…

    other 2023年6月26日
    00
  • cdsview注解解析**field

    以下是“CDS View注解解析**field”的完整攻略: CDS View注解解析**field 在CDS View中,我们可以使用field注解来定义字段。以下是解field注解的步骤: 1. 定义字段 首先,我们需要定义字段。可以使用以下代码: @AbapCatalog.sqlViewName: ‘Z_MY_VIEW’ @AbapCatalog.co…

    other 2023年5月7日
    00
  • 飙酷车神无法连接服务器怎么办 无法连接服务器解决方法介绍

    飙酷车神无法连接服务器怎么办? 飙酷车神是一款很受欢迎的赛车游戏,但有时候玩家可能会遇到无法连接服务器的问题。这种问题多数情况下是由于游戏的服务器出现了故障或玩家的网络连接有问题所导致的。下面介绍一些解决方法。 解决方法一:检查网络连接 首先,你需要检查你的网络连接是否正常。如果你的网络连接不稳定或者中断,你可能会无法连接到游戏服务器。你可以尝试以下方法: …

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