You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何Mock HTTP请求的第二次重试调用?

我的第一个项目:短信发送工具库开发

最近我在搞我的第一个项目——一个小型的短信发送工具库,已经给它加上了等待与重试逻辑:要是第一次请求没拿到成功状态,它会自动重试。

下面是向短信发送服务发起请求的核心HTTP逻辑,代码里的注释会一步步说明流程:

for {
    // 发送HTTP请求到短信服务
    resp, err := HTTPClient.Do(req)
    // 检查请求是否成功,返回三个值:是否成功、查询结果的URL(若需异步校验)、错误信息
    checkOK, checkSuccessUrl, checkErr := CheckSuccessStatus(resp, err)
    
    // 如果请求成功,直接跳出循环结束流程
    if checkOK {
        break
    }
    
    // 处理错误情况:先判断是否是可重试的错误
    if checkErr != nil {
        // 比如网络超时、服务5xx错误这类可重试的情况,就等一会儿再试
        if isRetryable(checkErr) {
            time.Sleep(retryInterval) // 这里可以改成指数退避,比如每次等待时间翻倍
            continue
        }
        // 像参数错误、权限不足这类不可重试的错误,直接返回错误
        return checkErr
    }
    
    // 还有一种场景:请求没报错,但短信服务是异步的,需要轮询指定URL查状态
    if checkSuccessUrl != "" {
        // 等待一段时间后发起查询请求
        time.Sleep(pollInterval)
        req, _ = http.NewRequest("GET", checkSuccessUrl, nil)
        continue
    }
    
    // 兜底:如果所有情况都不满足,返回最终错误
    return fmt.Errorf("短信发送重试多次后仍失败")
}

关于重试逻辑的几个小建议

  • 一定要区分可重试错误和不可重试错误,别对着参数错误死磕重试,既浪费资源又没用
  • 记得加重试次数上限,不然遇到极端情况可能会无限循环
  • 等待时间推荐用指数退避策略,比如第一次等1秒,第二次2秒,第三次4秒,这样能减轻短信服务的压力

内容的提问来源于stack exchange,提问作者diwakarb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:22:52