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

前言

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

 🍅 个人主页:南木元元


目录

背景

什么是接口错误重试?

明确关键点

接口重试功能的实现

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月…

网络编程文件传输小练习

客户端 public class client {public static void main(String[] args) {try {//创建一个客户端的发送对象,指定一个端口号Socket socketnew Socket("127.0.0.1",10000);//读取本地文件的数据//将本地文件读到输入流中//bis是输入流,将本地文件读入流中,bos是输出流…

C#-哈希表

哈希表&#xff08;Hash Table&#xff09;是一种数据结构&#xff0c;用于实现键值对之间的映射关系。在哈希表中&#xff0c;通过将键&#xff08;key&#xff09;通过哈希函数转换成索引&#xff0c;然后将值&#xff08;value&#xff09;存储在对应索引的位置上&#xff0…

人工智能_大模型033_LangChain003_记忆封装Memory上下文控制机制_LCEL表达式语言---人工智能工作笔记0168

## 三、记忆封装:Memory ### 3.1、对话上下文:ConversationBufferMemory from langchain.memory import ConversationBufferMemory, ConversationBufferWindowMemoryhistory = ConversationBufferMemory() history.save_context({"input": "你好啊"}…

从建表语句带你学习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;免…

Mybatis-plus自定义BaseMapper文件

Mybatis-plus自定义BaseMapper文件 这里主要是介绍通过MyBatis-Plus使用自定义继承 baseMapper 扩展指定返回VO类型等&#xff0c;方便以后查阅&#xff01;&#xff01;&#xff01; 自定义CustomBaseMapper文件 package com.wl.cloud.core.mybatis;import cn.hutool.core.be…

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;这可以防止攻击者从错误信息中获取敏…

SpringBoot实用开发(十四)-- 消息(Message)的简单认识

目录 1.消息的概念 2.Java处理消息的标准规范 3.JMS 4.AMQP 5.MQTT 1.消息的概念 广义角度来说,消息其实就是信息,但是和信息又有所不同。信息通常被定义为一组数据,而消息除了具有数据的特征之外,还有

数据结构-加解密算法

引言 加解密算法是信息安全领域的重要组成部分&#xff0c;它们用于保护数据的机密性、完整性和可用性。 对称加密算法 对称加密算法使用相同的密钥进行加密和解密。 特性&#xff1a; 加密和解密速度快&#xff0c;适合处理大量数据。 优点&#xff1a; 效率高&#xf…

设计模式之大话西游

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;美国…

leetcode705-Design HashSet

题目 不使用任何内建的哈希表库设计一个哈希集合&#xff08;HashSet&#xff09;。 实现 MyHashSet 类&#xff1a; void add(key) 向哈希集合中插入值 key 。 bool contains(key) 返回哈希集合中是否存在这个值 key 。 void remove(key) 将给定值 key 从哈希集合中删除。如果…

LlamaIndex 文档3

文章目录 一、使用 LLamaIndex 构建全栈 Web 应用程序的指南1、Flask 后端基本 Flask - 处理用户索引查询Advanced Flask - 处理用户文档上传 2、React 前端获取文档.tsx查询索引.tsx插入文档.tsx所有其他前端优点 3、结论 二、使用 Delphic 构建全栈 LlamaIndex Web 应用程序的…