面试官:请实现一个接口错误重试功能

前言

 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步!

 🍅 个人主页:南木元元


目录

背景

什么是接口错误重试?

明确关键点

接口重试功能的实现

Axios库

实现接口重试

发起请求

结语


背景

某次面试的时候,闯过了八股的重重考验,本以为要结束了,不曾想,还有最后一个大关,场景设计题,面试官开始发问:假如要你实现一个接口错误重试的功能,你会怎么做?

看着面试官的微笑,我就知道其中必定有坑。在我的一顿输出下,面试官让我回去等通知。。。

什么是接口错误重试?

接口错误重试指的是在网络不稳定的情况下,接口请求可能会因为网络超时、服务器错误或其他原因导致失败,这时,可以通过接口重试功能,当前端发起的请求在遇到错误时可以进行自动重试,有效地提升应用的稳定性和用户体验。

明确关键点

实现之前,必须先明确实现该功能需要注意的几个关键点。

  • 当发起的接口请求因网络问题或服务器错误失败时,自动进行重试。
  • 设置最大重试次数,避免无限重试造成资源浪费或死循环。
  • 控制重试的时间间隔,避免对服务器造成过大压力。

下面开始实现。

接口重试功能的实现

前端向后端发起请求会使用 HTTP 协议来进行数据交互,通常基于第三方库来发起请求。

Axios库

Axios 是一个流行的基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 中发起 HTTP 请求。

以下是Axios的一些重要特点和功能:

  1. 基于Promise。基于Promise实现,因此支持异步操作,可以通过 .then().catch() 处理请求和响应。
  2. 支持浏览器和 Node.js。可以在浏览器和 Node.js 环境中使用,提供了一致的 API。
  3. 拦截器。提供了拦截器功能,可以在请求或响应被处理前进行拦截和处理。
  4. CSRF 防御。Axios 默认支持防止 CSRF(跨站请求伪造)攻击,通过在请求头中自动添加 CSRF token 来保护应用。
  5. 取消请求。Axios 允许通过取消令牌来取消请求,可以有效地处理不再需要的请求,避免资源浪费。
  6. 简单易用。易于上手和使用,可以轻松地发起 GET、POST 等各种类型的请求。

下面是使用Axios发起GET请求的示例:

import axios from 'axios';axios.get('/api/data').then(res => {console.log(res.data);}).catch(error => {console.error(error);});

实现接口重试

当使用 Axios 发起请求时,可以通过 Axios 的拦截器和 Promise 特性来实现接口错误重试功能。

  • Axios 实例化

使用 axios.create() 创建一个 Axios 实例,这样可以自定义配置,比如基本 URL 和超时时间。

// 创建 Axios 实例
const instance = axios.create({baseURL: 'https://api.example.com',timeout: 5000, // 请求超时时间
});
  • 添加请求和响应拦截器

1.添加请求拦截器。

// 添加请求拦截器
axios.interceptors.request.use(function (config) {// 在发送请求之前做些什么,例如添加请求头、加载进度条等return config;}, function (error) {// 对请求错误做些什么return Promise.reject(error);});

2.添加响应拦截器。

这一步是关键,在响应拦截器中,处理请求发生错误的情况,检查是否需要重试请求。

重试的逻辑:判断是否已经达到重试次数上限,如果没有,则增加重试次数,并用 setTimeout 设置延迟后再次发起请求。

// 设置最大重试次数
const maxRetry = 3;// 添加响应拦截器
instance.interceptors.response.use((response) => {// 在响应返回之前可以进行一些处理,例如处理错误状态码等return response;},(error) => {// 在发生错误时进行重试const config = error.config;// 判断是否已经达到重试次数上限if (!config || !config.retryCount || config.retryCount >= maxRetry) {return Promise.reject(error); //直接返回错误}// 增加重试次数config.retryCount = config.retryCount ? config.retryCount + 1 : 1;// 创建新的 Promise 进行重试return new Promise((resolve) => {setTimeout(() => resolve(api(config)), 1000); // 1秒后重试});}
);

发起请求

这样,每次请求如果遇到服务器错误,就会自动重试,直到达到最大重试次数或者请求成功为止。

// 发起请求
instance.get('/api/data').then((response) => {console.log('请求成功', response.data);}).catch((error) => {console.error('请求失败', error);});

让我们再来回顾下整个实现流程吧!

结语

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~ 

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

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

相关文章

有点意思!腾讯 ARC Lab 最新发布的MiraData数据集,用于长视频生成,从这些方面做了clip分层描述……

最近小编网上冲浪时,被腾讯 PCG ARC Lab 新开源的文本-视频数据集——MiraData 吸引了目光。 这个数据集有多新?Readme在一天前刚更新完的那种,而且数据集有一大特点,是专门为长视频生成任务设计的大规模视频数据集,不…

2024年生物医学与食品安全国际会议 (ICBFS 2024)

2024年生物医学与食品安全国际会议 (ICBFS 2024) 2024 International Conference on Environmental Prevention and New Materials 【会议简介】 2024年生物医学与食品安全国际会议即将在成都召开。本次会议将汇聚全球生物医学与食品安全领域的专家学者,共同探讨生…

【JavaSE进阶】05-集合

集合继承结构图 集合继承结构图_Collection部分 注&#xff1a;泛化关系即继承关系&#xff0c;is a&#xff1b;关联关系&#xff0c;has a&#xff1b;实现关系&#xff0c;like a 1 接口java.util.Collection<E>: 接口Collection是集合中的超级父接口 Iterator it…

英特尔推出中国特供版Gaudi 3芯片,性能暴降92%以应对美国出口管制|TodayAI

英特尔近期发布消息&#xff0c;其将在中国市场推出专为该地区定制的“特供版”Gaudi 3 AI芯片&#xff0c;以符合美国对AI芯片的出口管制。这一版本包括HL-328型号的OAM兼容夹层卡&#xff0c;预计将于6月24日发布&#xff1b;以及HL-388型号的PCIe加速卡&#xff0c;计划在9月…

从建表语句带你学习doris_表索引

1、doris建表概述 1.1、doris建表模板 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [DATABASE.]table_name (column_definition1[,column_deinition2,......][,index_definition1,[,index_definition2,]] ) [ENGINE [olap|mysql|broker|hive]] [key_desc] [COMMENT "tabl…

不花一分钱,四大方法教你免费申请SSL证书

在数字化时代&#xff0c;数据安全与隐私保护的重要性日益凸显。为了确保在线信息传输的机密性和完整性&#xff0c;数字证书&#xff0c;尤其是SSL/TLS证书扮演着至关重要的角色。为个人及企业用户提供了经济、高效的加密解决方案。随着市场对SSL证书的逐渐重视&#xff0c;免…

docker run启动一个开发备忘清单速查表 —— 筑梦之路

docker run -itd --name reference -p 3000:3000 registry.cn-beijing.aliyuncs.com/deanmr/reference:latest包含&#xff1a;运维&#xff0c;前端&#xff0c;后端&#xff0c;工具&#xff0c;命令&#xff0c;数据库 部分截图展示&#xff1a;

【Bugku】sqli-0x1

1.打开靶场&#xff0c;进入实验场景 2.按F12查看源代码&#xff0c;发现有一个/?pls_help路径&#xff0c;在url后加上查看。 3.得到的php源码 首先&#xff0c;代码通过 error_reporting(0) 和 error_log(0) 关闭了错误报告&#xff0c;这可以防止攻击者从错误信息中获取敏…

设计模式之大话西游

8年前深究设计模式&#xff0c;现如今再次回锅&#xff5e; 还是大话设计模式 这本书还是可以的 大话西游经典的台词&#xff1a;“曾经有一份真挚的爱情摆在我面前,我没有珍惜,等我失去的时候,我才后悔莫及,人世间最痛苦的事莫过于此。如果上天能够给我一个再来一次的机会,我会…

【每周精选资讯 | 第 5 期】2024-04-08 ~ 2024-04-14

文章目录 前言内容百度智能云发布干帆大模型一体机&#xff0c;加速企业私有化部署大模型北大开源 aiXcoder-7B 代码大模型&#xff0c;专为企业私有部署设计WPS AI 企业版发布&#xff1a;多个大模型自由切换英特尔发布 AI 芯片 Gaudi 3&#xff0c;称性能超越英伟达 H100马云…

国外站群服务器有哪几种?

国外站群服务器种类繁多&#xff0c;它们各具特色&#xff0c;适用于不同的业务需求和场景。以下将为您科普几种常见的国外站群服务器及其特点。 首先&#xff0c;美国站群服务器以其丰富的IP资源和强大的网络技术著称。作为全球网络技术和数据中心发展的领先者&#xff0c;美国…

数据库SQL语言实战(二)

目录 检索查询 题目一 题目二 题目三 题目四 题目五 题目六 题目七 题目八 题目九&#xff08;本篇最难的题目&#xff09; 分析 实现&#xff08;两种方式&#xff09; 模板 总结 检索查询 按照要求查找数据库中的数据 题目一 找出没有选修任何课程的学…

YesPMP众包平台 | 活动有礼,现金奖励点击领取!

YesPMP众包平台在线发福利啦&#xff0c;4月16日活动火热开启&#xff0c;现金奖励等你来领&#xff0c;最高可领千元&#xff0c;赶快参与将奖励收入囊中&#xff0c;一起来了解活动细节吧&#xff01; 一、活动内容&#xff1a; 活动一&#xff1a;【项目征集令】活动&…

Python Flask-Security- 构建安全而强大的Web应用

Flask-Security是一个基于Flask的安全扩展&#xff0c;为开发者提供了构建安全且强大的Web应用的工具。本文将深入探讨Flask- Security的核心功能、基本用法以及在实际应用中的一些高级特性&#xff0c;通过丰富的示例代码&#xff0c;助您更全面地了解和应用这一用于Web应用安…

2024年【危险化学品经营单位主要负责人】考试题库及危险化学品经营单位主要负责人新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位主要负责人考试题库是安全生产模拟考试一点通总题库中生成的一套危险化学品经营单位主要负责人新版试题&#xff0c;安全生产模拟考试一点通上危险化学品经营单位主要负责人作业手机同步练习。2024…

python+playwright 学习-88 禁止加载图片等资源

前言 对于爬虫的小伙伴来说,有时候只需抓取页面的文本,不用加载图片,可以加快操作页面速度,那么我们可以设置禁止加载图片等资源。 禁止图片加载 根据url地址的后缀,图片资源后缀一般是png,jpg,jpeg,gif等格式。 from playwright.sync_api import sync_playwrightwith…

Gradle 实战 - 插件-ApiHug准备-工具篇-015

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace ApiHug …

rv1103/buildroot系统中添加包如v4l2

v4l2: rv1103给出的包中已经有v4l,只需要在menuconfig中打开编译选项&#xff0c;步骤如下&#xff1a; 在luckfox的github网站中下载的源代码在~/linux/luckfox/luckfox-pico-main中目录结构如下&#xff1a; 打开编译选项 cd ./sysdrv/source/buildroot/buildroot-2023.02.…

一种驱动器的功能安全架构介绍

下图提供了驱动器实现安全功能的架构 具有如下特点&#xff1a; 1.通用基于总线或者非总线的架构。可以实现ethercat的FSOE&#xff0c;profinet的profisafe&#xff0c;或者伺服本体安全DIO现实安全功能。 2.基于1oo2D架构&#xff0c;安全等级可以达到sil3。 3.高可用性。单…

第十五篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python 自动化处理图像在各行各业的应用场景

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、行业应用场景介绍二、 **计算机视觉研究与开发示例代码**三、人工智能与机器学习示例代码四、医疗健康领域示例代码五、制造业与质量控制示例代码六、农业与环境科学示例代码七、电子商务…