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日

相关文章

  • delphixe11中文文档

    以下是“DelphiXE11中文文档”的完整攻略: DelphiXE11中文文档 DelphiXE11是一款流行的集成开发环境(IDE),用于开发Windows应用程序。以下是获取DelXE11中文文档的步骤: 访问Embarcadero官网。 在获取DelphiXE11中文文档之前,您需要问Embarcadero官网。您可以在浏览器中输入以下网址来访问Em…

    other 2023年5月7日
    00
  • 关于gitversion主线:gitversion主线-每次推送的版本增量

    以下是关于GitVersion主线每次推送的版本增量的完整攻略,包括基本知识和两个示例说明。 基本知识 GitVersion是一个自动版本控制工具,它可以根据Git提交历史记录自动计算版本号。GitVersion主线是GitVersion的主要分支,它包含了GitVersion的最新功能和修复的错误。 在GitVersion主线中,每次推送都会增加版本号。G…

    other 2023年5月7日
    00
  • java 可重启线程及线程池类的设计(详解)

    Java 可重启线程及线程池类的设计(详解) 1. 什么是可重启线程? 可重启线程是指线程在运行过程中,如果因为异常情况或其他原因被中断或停止时,能够自动恢复并重新开始运行的线程。 2. 如何实现可重启线程? 可以通过以下步骤来实现可重启线程: 步骤一:继承 Thread 类,实现自定义线程类 public class RestartableThread e…

    other 2023年6月27日
    00
  • c++-在c++中将char转换为int

    在C++中将char类型转换为int类型的方法有多种,下面是两种常用的方法: 方法1:使用强制类型转换 可以使用强制类型转换将char类型转换为int。例如: char c = ‘a’; int i = (int)c; 在上面的示例中,将字符’a’赋值给变量c,然后使用强制类型转换将c转换为int类型,并将结果赋值给变量i。 方法2:使用ASCII码 在C+…

    other 2023年5月7日
    00
  • DOS批处理高级教程 第三章 FOR命令中的变量

    DOS批处理高级教程 第三章 FOR命令中的变量 一、概述 在DOS批处理中,FOR命令是非常常用的一个命令,在处理批处理脚本时,可以利用FOR命令来循环处理一些操作,从而提高效率和减少手动输入命令的时间。 二、变量的定义 在FOR命令中,有三个变量可以使用,分别是: %%i:在FOR /F命令中,表示从文件或命令中读取的值; %i:在FOR命令中,表示需要…

    other 2023年6月26日
    00
  • Flash CS6怎么制作自动加载的进度条动画?

    制作自动加载进度条动画可以使用Flash CS6自带的组件和ActionScript 3.0的编程,下面是制作步骤的完整攻略: 1.新建Flash文档和进度条动画资源 首先,使用Flash CS6新建一个Flash文档,并准备好进度条动画所需的资源,如进度条素材、文本标签等。 2.添加进度条组件 在新建的Flash文档中,打开“组件”面板,在“用户界面”分类…

    other 2023年6月25日
    00
  • Laravel框架集成UEditor编辑器的方法图文与实例详解

    现在我将为您详细介绍“Laravel框架集成UEditor编辑器的方法图文与实例详解”的完整攻略。 1. 下载UEditor编辑器及其Laravel扩展包 首先,您需要下载UEditor编辑器和其Laravel扩展包。UEditor编辑器可以在其官网下载,而Laravel扩展包可以在Composer(Laravel的依赖管理器)中下载。在命令行中使用如下命令…

    other 2023年6月27日
    00
  • qtdesigner汉化教程

    QtDesigner汉化教程 QtDesigner是一个用于创建Qt界面的可视化工具。默认情况下,QtDesigner是英文界面,但是我们可以通过汉化来将其界面为中文。本攻略将介绍如何汉化QtDesigner,并提供两个示例。 步骤1:下载汉化文件 我们可以从网下载QtDesigner的汉化文件。以下下载汉化文件的步骤: 打开Qt官网(https://www…

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