Y++ 社区

示例

HTTP 超时与重试

示例 浏览 1 管理员

HTTP类线程池重试

置超时 + 状态码判断失败重试;放到线程池,避免按钮里延时空转卡界面。

HTTP 超时与重试

库没有单独的「重试」命令:用 置超时 + 看状态码 / 取错误(),失败再请求即可。

不要在按钮单击里 延时 空转——会卡住窗口。后台拉、完成事件再改控件(同「线程回 UI」示例)。

完整说明见官网文档:HTTP 超时与重试。

准备

窗口需有:按钮拉取、标签1。把 g_url 换成你的接口。

源码

文本 g_url = "https://httpbin.org/get"
文本 g_结果
文本 g_错误
整数 g_池 = 0
逻辑 g_忙碌 = 假

函数 可重试 (整数 码) 逻辑 {
    如果 (码 == 0) {
        返回 (真)          // 超时、连不上
    }
    如果 (码 >= 500 && 码 <= 599) {
        返回 (真)
    }
    返回 (假)
}

函数 后台拉 (整数 dummy) {
    HTTP类 http
    http.置超时(8000)
    g_结果 = ""
    g_错误 = ""
    整数 i
    循环 (3, i) {
        文本 回 = http.提交("GET", g_url)
        整数 码 = http.取状态码()
        如果 (码 >= 200 && 码 < 300) {
            g_结果 = 回
            g_错误 = ""
            返回 ()
        }
        g_错误 = http.取错误()
        如果 (g_错误 == "") {
            g_错误 = "状态码 " + 到文本(码)
        }
        如果 (可重试(码) == 假) {
            返回 ()        // 4xx 等不要连打
        }
        如果 (i < 2) {
            延时(400 * (i + 1))
        }
    }
}

函数 拉完 (整数 序号) {
    g_忙碌 = 假
    按钮拉取.启用 = 真
    如果 (g_错误 == "") {
        标签1.标题 = "成功,长度 " + 到文本(取文本长度(g_结果))
    } 否则 {
        标签1.标题 = "失败:" + g_错误
    }
    如果 (g_池 != 0) {
        关闭线程池(g_池)
        g_池 = 0
    }
}

函数 按钮拉取.单击 (整数 X, 整数 Y) {
    如果 (g_忙碌) {
        返回 ()
    }
    g_忙碌 = 真
    按钮拉取.启用 = 假
    标签1.标题 = "请求中…"
    g_池 = 创建线程池(1)
    如果 (g_池 == 0) {
        g_忙碌 = 假
        按钮拉取.启用 = 真
        标签1.标题 = "创建线程池失败"
        返回 ()
    }
    置线程池完成事件(g_池, &拉完)
    投递任务(g_池, &后台拉, 0)
}

函数 主窗口.创建完毕 () {
    标签1.标题 = "点「拉取」:超时 8 秒,最多 3 次"
}

易错对照

  • 按钮里 循环 + 延时 重试 → 放到工作线程;拉完 里改标签
  • 400/401 也重试 → 只重试超时(状态码 0)和 5xx
  • 不看 取状态码() → 空文本可能是超时,也可能是 204

相关:HTTP类文档