YStudio Y++

HTTP 超时与重试

Y++ / YStudio 开发文档 · 一点滴

库没有单独的「重试」命令:置超时 + 看状态码/取错误(),失败再请求即可。
不要在按钮单击里 延时 空转——会卡住窗口。后台拉、完成事件再改控件(同 线程回 UI)。

窗口需有:按钮拉取、标签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

启用自动Cookie(真) 后,重试仍用同一 HTTP类 会话,登录态会带着。对照:http.md · thread-support.md