网络波动时,别让请求轻易失败
在搭建家庭或小型办公无线网络时,设备之间常通过API进行通信。比如你用手机App控制智能路由器,或者多个节点间同步配置信息。这时候如果网络稍微抖动一下,请求就卡住了,体验很糟。其实,合理的重试机制能让这些交互更 robust。
什么是API重试机制
简单说,就是当一次API调用失败后,系统自动再试几次,而不是直接报错给用户。比如你点击“重启路由器”,按钮点了没反应,其实是请求被临时丢包了。如果有重试逻辑,系统会默默再发一两次请求,大概率就能成功。
这在无线环境中特别实用。Wi-Fi信号受墙体、电器干扰,偶尔丢个包很正常。不能因为一次失败就判定“设备离线”。
怎么设置才合理
不是所有失败都值得重试。比如返回401权限错误,说明账号有问题,再试十次也没用。但如果是503服务不可用或连接超时,就可以考虑重发。
常见的策略是“指数退避 + 随机抖动”。第一次等1秒重试,第二次等2秒,第三次等4秒,避免大量请求同时砸向服务器。再加上一点随机时间,防止多个设备集体“撞车”。
const retryFetch = async (url, options = {}, maxRetries = 3) => {
for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch(url, options);
if (response.ok) return response;
// 5xx 错误才重试
if (response.status >= 500) {
throw new Error(`Server error: ${response.status}`);
} else {
// 4xx 错误不重试
return response;
}
} catch (err) {
if (i === maxRetries - 1) throw err;
const delay = Math.pow(2, i) * 1000 + Math.random() * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
}
}
};写进API文档的重要性
很多开发者只写接口怎么调,不写“调失败了怎么办”。但对使用者来说,知道哪些情况会触发重试、最多试几次、间隔多久,能少踩很多坑。
比如你在开发一个Mesh组网App,调用后台API获取节点状态。文档里注明“客户端建议实现指数重试,最大3次”,别人就知道该怎么处理网络不稳定的情况。
再比如某些固件升级接口,本身就不支持频繁调用。这时候要在文档里明确写“请勿重试”,避免触发限流。
实际场景中的小细节
有一次调试酒店的无线系统,发现AP上线时上报配置总是丢第一包。后来在请求层加了两轮回调重试,问题就消失了。根本不用改硬件,也不用换路由器。
还有些老设备对HTTP头部大小有限制,重试时如果带上完整日志信息,反而会导致后续请求也失败。这种就得在重试时精简数据,只保留必要字段。
重试机制不是万能药,但它像雨天里的备用伞,关键时刻能顶上。