使用 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.mzph.cn/bicheng/61076.shtml

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

相关文章

【最大子矩阵——双指针 / 二分】

题目 双指针&#xff1a; 代码 #include <bits/stdc.h> using namespace std; const int N 85, M 1e510; int g[N][M]; int n, m, lim; int ans 1; int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for(int i 1; i < n; i)for(int …

内网渗透-隧道判断-SSH-DNS-icmp-smb-上线linux-mac

1.通道判断 #SMB 隧道&通讯&上线 判断&#xff1a;445 通讯 上线&#xff1a;借助通讯后绑定上线 通讯&#xff1a;直接 SMB 协议通讯即可 #ICMP 隧道&通讯&上线 判断&#xff1a;ping 命令 上线&#xff1a;见前面课程 通讯&#xff1a;其他项…

【优选算法篇】分治乾坤,万物归一:在重组中窥见无声的秩序

文章目录 分治专题&#xff08;二&#xff09;&#xff1a;归并排序的核心思想与进阶应用前言、第二章&#xff1a;归并排序的应用与延展2.1 归并排序&#xff08;medium&#xff09;解法&#xff08;归并排序&#xff09;C 代码实现易错点提示时间复杂度和空间复杂度 2.2 数组…

【微软:多模态基础模型】(3)视觉生成

欢迎关注【youcans的AGI学习笔记】原创作品 【微软&#xff1a;多模态基础模型】&#xff08;1&#xff09;从专家到通用助手 【微软&#xff1a;多模态基础模型】&#xff08;2&#xff09;视觉理解 【微软&#xff1a;多模态基础模型】&#xff08;3&#xff09;视觉生成 【微…

netcore Kafka

一、新建项目KafakDemo <ItemGroup><PackageReference Include"Confluent.Kafka" Version"2.6.0" /></ItemGroup> 二、Program.cs using Confluent.Kafka; using System; using System.Threading; using System.Threading.Tasks;names…

工业生产安全-安全帽第一篇-opencv及java开发环境搭建

一.背景 公司是非煤采矿业&#xff0c;核心业务是采选&#xff0c;大型设备多&#xff0c;安全风险因素多。当下政府重视安全&#xff0c;头部技术企业的安全解决方案先进但价格不低&#xff0c;作为民营企业对安全投入的成本很敏感。利用我本身所学&#xff0c;准备搭建公司的…

fastadmin多个表crud连表操作步骤

1、crud命令 php think crud -t xq_user_credential -u 1 -c credential -i voucher_type,nickname,user_id,voucher_url,status,time --forcetrue2、修改控制器controller文件 <?phpnamespace app\admin\controller;use app\common\controller\Backend;/*** 凭证信息…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-26

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

Essential Cell Biology--Fifth Edition--Chapter one (8)

1.1.4.6 The Cytoskeleton [细胞骨架] Is Responsible for Directed Cell Movements 细胞质基液不仅仅是一种无结构的化学物质和细胞器的混合物[soup]。在电子显微镜下&#xff0c;我们可以看到真核细胞的细胞质基液是由长而细的丝交叉而成的。通常[Frequently]&#xff0c;可…

RK3568 Linux 系统加系统运行指示灯

一、dts配置 gpio-leds {status = "okay";compatible = "gpio-leds";work-led {gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>

C++11(六)----包装器function和bind

文章目录 包装器&#xff1a;function包装器&#xff1a;bind 包装器&#xff1a;function function接口介绍 在头文件<functional>中 语法&#xff1a;function的语法比较特殊 function<返回值(参数)> 自定义变量名 要被包装的可调用对象 class Plus { public:…

店铺推推-项目测试用例设计(Xmind)

项目介绍&#xff1a; 技术栈: Spring BootMyBatisRedis项目描述&#xff1a; 项目旨在为消费者提供一个公平、公开、透明的平台&#xff0c;让消费者能够基于真实的消费体验对店铺进行评价和 推荐&#xff0c;并为其他潜在消费者提供参考。同时&#xff0c;店铺推推也是为商家…

c++--------《set 和 map》

c--------《set 和 map》 1 set系列的使⽤1.1 set类的介绍1.2 set的构造和迭代器1.3 set重要接口 2 实现样例2.1: insert和迭代器遍历使⽤样例&#xff1a;2.2: find和erase使⽤样例&#xff1a; 练习3.map系列的使用3.1 map类的介绍3.1.1 pair类型介绍 3.2 map的数据修改3.3mu…

GIS融合之路(八)-如何用Cesium直接加载OSGB文件(不用转换成3dtiles)

系列传送门&#xff1a; 山海鲸可视化&#xff1a;GIS融合之路&#xff08;一&#xff09;技术选型CesiumJS/loaders.gl/iTowns? 山海鲸可视化&#xff1a;GIS融合之路&#xff08;二&#xff09;CesiumJS和ThreeJS深度缓冲区整合 山海鲸可视化&#xff1a;GIS融合之路&…

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过&#xff0c;上架后却一直无法被搜索到。打开后&#xff0c;再在 QQ 上下拉查看 “最近使用”&#xff0c;发现他出现一下又马上消失。 上线是按正常流程走的&#xff0c;开发、备案、审核&#xff0c;没有任何违规&#xf…

word 中长公式换行 / 对齐 | Mathtype 中长公式换行拆分 | latex 中长公式换行

注&#xff1a;本文为 “word 中长公式换行 / 对齐 | Mathtype 中长公式换行拆分 | latex 中长公式换行” 相关专题文章合辑。 未整理去重。 “公式较长时最好在等号 “&#xff1d;” 处转行&#xff0c;如难实现&#xff0c;则可在&#xff0b;、&#xff0d;、、 运算符号处…

【优选算法 — 滑动窗口】串联所有单词的子串 最小覆盖子串

串联所有单词的子串 串联所有单词的子串 题目描述 题目解析 算法原理 以示例一为例&#xff0c;一定要记得&#xff0c;words中的每一个字符串长度相同&#xff0c;所以我们可以根据 words 中的每一个字符串的长度length&#xff0c;将 s 这个字符串以 length 个为一组来…

WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等

SQL注入课程体系&#xff1a; 1、数据库注入-access mysql mssql oracle mongodb postgresql 2、数据类型注入-数字型 字符型 搜索型 加密型&#xff08;base64 json等&#xff09; 3、提交方式注入-get post cookie http头等 4、查询方式注入-查询 增加 删除 更新 堆叠等 …

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕&#xff1a;printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾&#xff1a; VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序C语言概念之旅&#xff1a;解锁关…

SHELL(4)脚本与用户交互以及if条件判断

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…