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

HTTPBuilder如何实现响应码为202时重试直到返回200状态码

实现方案

核心逻辑是把单次HTTP请求包裹在循环结构中,仅当收到200状态码拿到有效游戏数据时才跳出循环返回结果;收到202响应时等待固定间隔后重新发起请求,同时增加最大重试限制避免死循环。

改造后可直接使用的代码

import java.util.concurrent.TimeUnit

def get_Game(String gameId, long retryIntervalMs = 1000, int maxRetries = 30) {
    def gameInfo = null
    int retryCount = 0

    while (gameInfo == null) {
        // 达到最大重试次数直接抛出异常,避免永久阻塞
        if (retryCount >= maxRetries) {
            throw new RuntimeException("获取游戏信息失败,连续${maxRetries}次请求均返回排队中状态")
        }

        http.request(Method.GET, ContentType.XML) {
            uri.path = gamePath
            uri.query = [id: gameId]
            
            // 200响应:读取结果赋值,触发循环退出
            response.'200' = { resp, reader ->
                gameInfo = reader.item
            }
            
            // 202响应:计数+1,不赋值gameInfo,后续进入重试等待
            response.'202' = {
                println "请求已进入排队,${retryIntervalMs}ms后进行第${retryCount + 1}次重试"
                retryCount++
            }
            
            // 其他异常状态码直接抛错,不做重试
            response.failure = { resp ->
                throw new RuntimeException("接口请求异常,状态码:${resp.status}")
            }
        }

        // 未拿到有效结果则等待间隔时间,再进入下一轮请求
        if (gameInfo == null) {
            TimeUnit.MILLISECONDS.sleep(retryIntervalMs)
        }
    }

    return gameInfo
}

调参说明

  • retryIntervalMs:重试间隔,单位毫秒,建议从1000ms(1秒)起步,根据业务接口实际排队耗时调整,不要设置过短避免高频请求压垮服务端
  • maxRetries:最大重试次数,和重试间隔配合控制最长等待时间,比如间隔1秒、重试30次就对应最长等待30秒,可根据业务容忍的最大等待时长调整
  • 如果业务不需要限制重试时长,可以去掉最大重试次数的判断,但生产环境不建议这么做,避免服务端异常时程序永久卡死

内容的提问来源于stack exchange,提问作者Marta Martínez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.07 07:54:28