如何使用Axios实现API请求失败后移除URL参数发起新请求
带参数降级重试的Axios请求实现
这个需求完全可以实现,你之前的代码没有达到预期,主要有两个核心问题:
- 没适配Axios的错误触发规则:Axios默认行为是,只要接口返回的HTTP状态码不在2xx成功区间(比如404、500等),就会直接抛出错误进入外层
catch捕获块,根本不会执行到你写的res.data.statusCode == 404判断分支,自然没法触发移除body参数后的重试逻辑。 - 存在语法错误:用
const声明的URL常量是无法被重新赋值的,运行到后续修改URL的代码行时会直接抛出TypeError。
最初的无效尝试代码
try { const URL = 'http://api.evoximages.com/api/v1/vehicles?make=' + make + '&model=' + model + '&year=' + year + '&pid=2&ptid=41&body=' + body; let res = await axios.get(URL); if (res.data.statusCode == 404) { URL = 'http://api.evoximages.com/api/v1/vehicles?make=' + make + '&model=' + model + '&year=' + year + '&pid=2&ptid=41'; res = await axios.get(URL); return res.data.data; } else { return res.data.data; } } catch (err) { return err; }
可用实现方案
既然所有首次请求的错误(包括404类响应)都会进入catch块,就不需要在成功分支做状态码校验,也避免了重复给常量赋值的语法错误,直接在catch块内嵌套发起移除body参数的新请求即可:
try { const originalURL = 'http://api.evoximages.com/api/v1/vehicles?make=' + make + '&model=' + model + '&year=' + year + '&pid=2&ptid=41&body=' + body; let res = await axios.get(originalURL); return res.data.data; } catch (err) { try { // 移除body参数的重试新请求 const retryURL = 'http://api.evoximages.com/api/v1/vehicles?make=' + make + '&model=' + model + '&year=' + year + '&pid=2&ptid=41'; let retryRes = await axios.get(retryURL); return retryRes.data.data; } catch (retryErr) { return retryErr; } }
内容的提问来源于stack exchange,提问作者Gustavo Mello
相关产品推荐
相关产品推荐

