使用 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'); // 从本地存储获取 tokenif (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 拦截器,会让开发过程更加高效。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除

老规矩,点赞评论收藏关注!!! 目录 线性表 其特点是: 算法实现: 运行结果展示 链表 插入元素: 删除元素: 算法实现 运行结果 线性表是由n个数据元素组成的有限序列&#xff…

LeetCode - #139 单词拆分

文章目录 前言摘要1. 描述2. 示例3. 答案题解动态规划的思路代码实现代码解析1. **将 wordDict 转换为 Set**2. **初始化 DP 数组**3. **状态转移方程**4. **返回结果** **测试用例**示例 1:示例 2:示例 3: 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗…

【第4章 | 分类与逻辑回归】(python机器学习)

一、逻辑回归 1.1逻辑回归 二项逻辑回归 • Binomial logistic regression model是一种分类模型 • 由条件概率P(Y|X)表示的分类模型 • 形式化为logistic distribution • X取实数,Y取值1,0 特点: • 事件的几率odds:事件发生与事件不发生…

Python毕业设计选题:基于python的豆瓣电影数据分析可视化系统-flask+spider

开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 个人中心 管理员登录界面 管理员功能界面 电影管理 用户管理 系统管理 摘要…

Scala之Array数组

可修改的Array import scala.collection.mutable.ArrayBuffer //Array:数组 //可修改的:ArrayBuffer //不可修改的:Array object Test1 {//可修改的:ArrayBufferdef main(args: Array[String]): Unit {//1.新建val arr1 ArrayBuffer(1,2,3)…

贴代码框架PasteForm特性介绍之select,selects,lselect和reload

简介 PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管…

麒麟网络负载均衡与高可用方案实践

安装 teamd 包。 yum -y install teamd Copy 一、配置TEAMING 查看两个网卡信息 ifconfig Copy 注意:根据实际网卡设备名称情况调整代码!不同环境下网卡名称略有不同! 根据查询的结果,两张网卡设备名称分别为 enp0s2 和 enp…

Python学习29天

二分查找 # 定义函数冒泡排序法从大到小排列 def bbble_sort(list):# i控制排序次数for i in range(len(list) - 1):# j控制每次排序比较次数for j in range(len(list) - 1 - i):if list[j] < list[j 1]:list[j], list[j 1] list[j 1], list[j] # 定义二分查找函数 def…

路由协议——iBGP与EBGP

一、适用场景 1、企业需要连接总部与分部&#xff0c;但总部与分部运行着不同的路由协议&#xff0c;总部到分部有自建的专线&#xff0c;端到端的设备支持BGP路由协议。 2、网络运营商&#xff0c;如电信、联通、移动等&#xff0c;各区域的ip路由表庞大&#xff0c;若要完成…

09.事件风暴

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 概念组成部分具体场景事件风暴寻找聚合 改进具体流程 参考 概念 事件风暴是Alberto Brandolini 发明的一种头脑风暴方法&#x…

蓝队技能-应急响应篇日志自动采集日志自动查看日志自动化分析Web安全内网攻防工具项目

知识点&#xff1a; 1、应急响应-系统日志收集-项目工具 2、应急响应-系统日志查看-项目工具 3、应急响应-日志自动分析-项目工具 演示案例-蓝队技能-工具项目-自动日志采集&自动日志查看&自动日志分析 系统日志自动采集-观星应急工具(Windows系统日志) SglabIr_Co…

【C++】绘制内存管理的地图

生活是属于每个人自己的感受&#xff0c;不属于任何人的看法。 前言 这是我自己学习C的第二篇博客总结。后期我会继续把C学习笔记开源至博客上。 上一期笔记是关于C的类与对象础知识&#xff0c;没看的同学可以过去看看&#xff1a; 【C】面向对象编程的艺术之旅-CSDN博客https…

在 CentOS 系统上直接安装 MongoDB 4.0.25

文章目录 步骤 1&#xff1a;配置 MongoDB 官方源步骤 2&#xff1a;安装 MongoDB步骤 3&#xff1a;启动 MongoDB 服务步骤 4&#xff1a;验证安装步骤 5&#xff1a;可选配置注意事项 以下是在 CentOS 系统上直接安装 MongoDB 4.0.25 的详细步骤&#xff1a; 步骤 1&#x…

core 不可变类型 线程安全 record

当一个类型的对象在创建时被指定状态后&#xff0c;就不会再变化的对象&#xff0c;我们称之为不可变类型。这种类型是线程安全的&#xff0c;不需要进行线程同步&#xff0c;非常适合并行计算的数据共享。它减少了更新对象会引起各种bug的风险&#xff0c;更为安全。 System.D…

OceanBase Shell开放内核运维接口,运维更便捷

DBA在日常业务中面临着繁琐的运维管理任务&#xff0c;亟需高效的工具和灵活的解决方案帮助他们简化操作、提升效率。因此&#xff0c;命令行操作和维护工具&#xff08;CLI工具&#xff09;&#xff0c;因其高效、灵活、可远程管理以及技术深度等特点&#xff0c;成为DBA和开发…

基于Amazon Bedrock:一站式多模态数据处理新体验

目录 引言 关于Amazon Bedrock 基础模型体验 1、进入环境 2、发现模型及快速体验 3、打开 Amazon Bedrock 控制台 4、通过 Playgrounds 体验模型 &#xff08;1&#xff09;文本生成 &#xff08;2&#xff09;图片生成 关于资源清理 结束语 引言 在云计算和人工智能…

go 学习网站,go例子 go demo go学习视频

1. 代码例子&#xff1a; Go by Example 2. b站 视频&#xff1a; 尚硅谷视频&#xff1a; 004_尚硅谷_程序的基本概念_哔哩哔哩_bilibili 3. go技术文档&#xff1a; fmt Go语言中文文档

Django基础配置

一.前言 前面我们说完了前端基础&#xff0c;现在我们开始讲后端框架了&#xff0c;我们今天说的是django&#xff0c;当然今天主要还是和大家了解一下框架和django的基础配置 二.web框架 2.1 web框架初始 在我们学习web框架的时候&#xff0c;我们首先得了解到web框架的本…

Hive分桶超详细!!!

1、分桶的意义 数据分区可能导致有些分区,数据过多&#xff0c;有些分区,数据极少。分桶是将数据集分解为若干部分(数据文件)的另一种技术。 分区和分桶其实都是对数据更细粒度的管理。当单个分区或者表中的数据越来越大&#xff0c;分区不能细粒度的划分数据时&#xff0c;我…

【AI大模型引领变革】探索AI如何重塑软件开发流程与未来趋势

文章目录 每日一句正能量前言流程与模式介绍【传统软件开发 VS AI参与的软件开发】一、传统软件开发流程与模式二、AI参与的软件开发流程与模式三、AI带来的不同之处 结论 AI在软件开发流程中的优势、挑战及应对策略AI在软件开发流程中的优势面临的挑战及应对策略 结论 后记 每…