使用 Axios 拦截器优化 HTTP 请求与响应的实践

目录

  • 前言
  • 1. Axios 简介与拦截器概念
    • 1.1 Axios 的特点
    • 1.2 什么是拦截器
  • 2. 请求拦截器的应用与实践
    • 2.1 请求拦截器的作用
    • 2.2 请求拦截器实现
  • 3. 响应拦截器的应用与实践
    • 3.1 响应拦截器的作用
    • 3.2 响应拦截器实现
  • 4. 综合实例:一个完整的 Axios 配置
  • 5. 使用拦截器的好处与注意事项
    • 5.1 优势
    • 5.2 注意事项
  • 结语

前言

在前端开发中,HTTP 请求是与后端交互的重要方式。为了提高代码的可维护性、复用性以及用户体验,使用 Axios 拦截器是非常常见的做法。通过拦截器,我们可以集中管理请求和响应的逻辑,比如配置请求头、处理错误信息等。本文将详细介绍如何使用 Axios 的请求拦截器和响应拦截器,并结合实践案例,分享如何让拦截器为开发效率和代码质量保驾护航。

1. Axios 简介与拦截器概念

在这里插入图片描述

1.1 Axios 的特点

Axios 是一个基于 Promise 的 HTTP 库,支持在浏览器和 Node.js 环境下运行。它提供了许多开箱即用的功能,比如:

  • 请求和响应的拦截。
  • 自动转换 JSON 数据。
  • 超时设置和取消请求。
  • 支持跨域。
  • 客户端防御 XSRF 攻击等。

这些功能让 Axios 成为目前主流的 HTTP 请求库之一。

1.2 什么是拦截器

拦截器是 Axios 提供的一种机制,它允许开发者在请求发送前或响应到达后对数据进行统一处理。具体分为:

  1. 请求拦截器:拦截并处理即将发出的请求,比如添加统一的请求头、添加认证 token 等。
  2. 响应拦截器:拦截并处理收到的响应,比如解析数据结构、统一处理错误提示等。

使用拦截器可以显著简化代码逻辑,并提高复用性。

在这里插入图片描述

2. 请求拦截器的应用与实践

2.1 请求拦截器的作用

请求拦截器主要用于处理以下场景:

  • 添加统一的请求头:比如设置 Content-Type、添加认证 Token。
  • 记录和调试:对每一个请求打印日志,便于调试和监控。
  • 预处理请求数据:在发送请求之前对数据格式进行处理。

2.2 请求拦截器实现

以下是一个基本的请求拦截器实现示例:

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

// 创建 axios 实例
const baseURL = 'http://localhost:8080';
const instance = axios.create({ baseURL });

// 添加请求拦截器
instance.interceptors.request.use(
  config => {
    // 在请求发送前处理请求
    config.headers['Content-Type'] = 'application/json'; // 设置统一的请求头
    const token = localStorage.getItem('token'); // 从本地存储获取 token
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`; // 为每个请求添加认证信息
    }
    return config;
  },
  error => {
    // 处理请求错误
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

export default instance;

在这个实现中,我们完成了:

  1. 设置基础 URL:通过 axios.create 设置公共的 API 地址。
  2. 添加请求头:为每个请求设置 Content-TypeAuthorization
  3. 错误处理:捕获请求配置过程中的错误并打印日志。

3. 响应拦截器的应用与实践

3.1 响应拦截器的作用

响应拦截器主要处理以下场景:

  • 提取核心数据:很多后端返回的数据结构是嵌套的,通过拦截器可以直接提取需要的核心数据。
  • 统一处理错误:捕获 HTTP 错误码并展示友好的提示。
  • 日志记录和调试:记录响应信息,便于分析问题。

3.2 响应拦截器实现

以下是一个响应拦截器的示例:

// 添加响应拦截器
instance.interceptors.response.use(
  response => {
    // 处理响应数据
    const result = response.data; // 假设后端返回 { code: 200, data: {...}, message: '成功' }
    if (result.code !== 200) {
      // 如果返回码不是 200,认为请求失败
      alert(result.message || '请求失败');
      return Promise.reject(new Error(result.message));
    }
    return result.data; // 直接返回核心数据
  },
  error => {
    // 处理响应错误
    if (error.response) {
      // 根据 HTTP 状态码给出提示
      const status = error.response.status;
      if (status === 401) {
        alert('未授权,请重新登录');
      } else if (status === 500) {
        alert('服务器错误,请稍后重试');
      } else {
        alert(`请求错误,状态码:${status}`);
      }
    } else {
      alert('网络错误,请检查您的网络连接');
    }
    return Promise.reject(error);
  }
);

在这个实现中,我们完成了:

  1. 数据提取:直接返回后端数据中的 data 部分。
  2. 错误提示:根据不同的状态码给出提示,比如未授权、服务器错误等。
  3. 网络异常处理:当服务器无法响应时,给出通用提示。

4. 综合实例:一个完整的 Axios 配置

以下是将请求拦截器和响应拦截器结合的完整实现:

import axios from 'axios';

const baseURL = 'http://localhost:8080';
const instance = axios.create({ baseURL });

// 请求拦截器
instance.interceptors.request.use(
  config => {
    config.headers['Content-Type'] = 'application/json';
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  response => {
    const result = response.data;
    if (result.code !== 200) {
      alert(result.message || '请求失败');
      return Promise.reject(new Error(result.message));
    }
    return result.data;
  },
  error => {
    if (error.response) {
      const status = error.response.status;
      if (status === 401) {
        alert('未授权,请重新登录');
      } else if (status === 500) {
        alert('服务器错误,请稍后重试');
      } else {
        alert(`请求错误,状态码:${status}`);
      }
    } else {
      alert('网络错误,请检查您的网络连接');
    }
    return Promise.reject(error);
  }
);

export default instance;

5. 使用拦截器的好处与注意事项

5.1 优势

  1. 代码复用:将公共逻辑集中到拦截器中,减少重复代码。
  2. 提高维护性:当需求变更时,只需修改拦截器即可应用到所有请求。
  3. 增强用户体验:通过统一的错误处理,提升应用的稳定性和友好性。

5.2 注意事项

  • 拦截器顺序:多个拦截器时,执行顺序与注册顺序一致。use 方法中的第一个函数处理成功,第二个函数处理错误。
  • 避免无限循环:在拦截器中若对请求进行重试或修改,应小心避免引发递归调用。
  • 捕获错误:确保所有 Promise 都有正确的错误处理,避免意外崩溃。

结语

请求拦截器和响应拦截器的灵活性和强大功能,使得它在项目开发中广受欢迎。合理使用拦截器,可以帮助我们减少冗余代码,提高代码的可读性和维护性。在项目中使用 Axios 拦截器,会让开发过程更加高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/919998.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Photino:通过.NET Core构建跨平台桌面应用程序,.net国产系统

一、Photino.NET简介: 最近发现了一个不错的框架 Photino.Net 一份代码运行,三个平台 windows max linux ,其中windows10,windows11,ubuntu 18.04,ubuntu 20.04 已测试均可以。mac 因为没有相关电脑没有测试。 github:https://github.com/t…

Python爬虫:如何从1688阿里巴巴获取公司信息

在当今的数字化时代,数据已成为企业决策和市场分析的重要资产。对于市场研究人员和企业分析师来说,能够快速获取和分析大量数据至关重要。阿里巴巴的1688.com作为中国最大的B2B电子商务平台之一,拥有海量的企业档案和产品信息。本文将介绍如何…

如何构建高效的接口自动化测试框架?

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 在选择接口测试自动化框架时,需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说,使用Python相关的测试框架更为便捷。无论选…

创建型设计模式(模版方法、观察者模式、策略模式)

继承过程中,虚函数表的变化。动态多态,继承中虚函数的重写

数据结构(顺序队列——c语言实现)

队列的概念: 队列是限制在两端进行插入和删除操作的线性表,允许进行存入的一端称为“队尾”,允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。特点:先进先出(FIFO)。 …

3C产品说明书电子化转变:用户体验、环保与商业机遇的共赢

在科技日新月异的当代社会,3C产品(涵盖计算机类、通信类和消费类电子产品)已成为我们日常生活中不可或缺的重要元素。与此同时,这些产品的配套说明书也经历了一场从纸质到电子化的深刻变革。这一转变不仅体现了技术的飞速进步&…

web服务nginx实验6:nginx发布动态页面的方法

安装软件: 启动服务: 创建文件: 再vim打开,写东西: 重启服务: Windows客户端测试:(服务端要关防火墙) 删除默认访问发.php文件: 创建一个新的配置文件&#x…

Three.js 相机控制器Controls

在 3D 场景中,摄像机的控制尤为重要,因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器,最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…

应急响应:玄机_Linux后门应急

https://xj.edisec.net/challenges/95 11关做出拿到万能密码,ATMB6666,后面都在root权限下操作 1、主机后门用户名称:提交格式如:flag{backdoor} cat /etc/passwd,发现后门用户 flag{backdoor} 2、主机排查项中可以…

.NET 9与C# 13革新:新数据类型与语法糖深度解析

记录(Record)类型 使用方式: public record Person(string FirstName, string LastName); 适用场景:当需要创建不可变的数据结构,且希望自动生成 GetHashCode 和 Equals 方法时。不适用场景:当数据结构需…

阿里云IIS虚拟主机部署ssl证书

宝塔配置SSL证书用起来是很方便的,只需要在站点里就可以配置好,但是云虚拟主机在管理的时候是没有这个权限的,只提供了简单的域名管理等信息。 此处记录下阿里云(原万网)的IIS虚拟主机如何配置部署SSL证书。 进入虚拟…

Vue通过file控件上传文件到Node服务器

功能: 1.多文件同时上传、2.拖动上传、3.实时上传进度条、4.中断上传和删除文件、5.原生file控件的美化 搁置的功能: 上传文件夹、大文件切片上传、以及其他限制条件未处理 Node服务器的前置准备: 新建文件夹: file_upload_serve初始化npm: npm …

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(1)开发环境搭建

VSCodeESP-IDF开发ESP32-S3-DevKitC-1(1)开发环境搭建 1.开发环境搭建(安装ESP-IDF)2.开发环境搭建(安装VS Code)3.开发环境搭建(VSCode中安装ESP-IDF插件及配置) 1.开发环境搭建&am…

个人全栈开发微信小程序上线了(记日记)

个人开发的全栈项目,《每日记鸭》微信小程序上线了! 主要是技术栈:uniapp,koa2,mongodb,langchian; 感兴趣的小伙伴可以来捧捧场!

南京邮电大学算法设计-二叉树先序遍历算法动态演示

二叉树先序遍历算法动态演示 一、课题内容和要求 (1)实验目的: 本实验通过手动输入二叉树结点信息,构建相应的二叉树,并通过图形化界面动态演示先序遍历算法的过程。通过本次实验,我可以深入理解二叉树的数据结构、先序遍历算法…

IntelliJ+SpringBoot项目实战(十)--常量类、自定义错误页、全局异常处理

一、常量类 在项目开发中,经常需要约定一些常量,比如接口返回响应请求指定状态码、异常类型、默认页数等,为了增加代码的可阅读性以及开发团队中规范一些常量的使用,可开发一些常量类。下面有3个常量类示例,代码位于op…

2025蓝桥杯(单片机)备赛--扩展外设之DS1302的使用(九)

1.DS1302数据手册的使用 a. DS1302 features: 工作电压:2V-5.5V 通信协议:3线接口(CE、IO、SCLK) 计时:秒、分、小时、月日期、月、星期、年(闰年补偿器期至2100年) b.原理图接线说明&#xff…

MCU中的定时器

第一章 定时器的应用场景 第二章 定时器的原理 2.1 定时器的计数原理 1. 定时器的本质是一个计数器; 2. 计数器是对输入的系统频率信号进行计数; 3. 每来一个周期的信号,计数器的cnt 加一。如果周期T表示为1s,来三个周期就表示…

类和对象——static 成员,匿名对象(C++)

1.static成员 a)⽤static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进行初始化。 b)静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。 …

POD-Transformer多变量回归预测(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现POD-Transformer多变量回归预测,本征正交分解数据降维融合Transformer多变量回归预测,使用SVD进行POD分解(本征正交分解); 2.运行环境Matlab20…