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

不使用MonoBehaviour与System.IO实现GET请求的问题排查与优化

Warudo模组GET请求问题分析与修复方案

问题原因

你的代码逻辑存在明显错误,导致大部分情况下返回空字符串:

  • 循环内的if (getRequest.isDone)完全无效:while (!getRequest.isDone)的条件决定了进入循环时isDone必然为false,内部的if判断永远不会触发,text始终保持初始的空值。
  • 偶尔返回预期值的情况属于偶然:只有当请求在SendWebRequest()调用后瞬间完成(比如本地缓存、极短响应时间),循环直接跳过,但此时你也没有读取响应内容,这种“成功”大概率是调试时的误判,或者代码运行时的极端巧合。
  • 未处理请求失败场景:如果请求出现错误(比如网络问题、URL无效),downloadHandler.text也会返回空字符串,你无法区分是请求失败还是无内容。

修复后的代码实现

修正MakeRequest方法

private string MakeRequest()
{
    using (var request = CreateRequest(URL))
    {
        var operation = request.SendWebRequest();
        // 阻塞等待请求完成,加入微小延迟避免CPU占用过高
        while (!operation.isDone)
        {
            System.Threading.Thread.Sleep(10);
        }

        // 先检查请求是否成功
        if (request.result != UnityWebRequest.Result.Success)
        {
            Debug.LogError($"GET请求失败: {request.error}");
            return string.Empty;
        }

        // 读取并返回响应内容
        return request.downloadHandler.text;
    }
}

修正CreateRequest方法

private UnityWebRequest CreateRequest(string path)
{
    var request = new UnityWebRequest(path, "GET");
    request.downloadHandler = new DownloadHandlerBuffer();
    // GET请求无需设置Content-Type,设置Accept头指定期望接收JSON格式
    request.SetRequestHeader("Accept", "application/json");

    return request;
}

更优实现说明

  • 资源自动释放:用using语句包裹UnityWebRequest,确保请求对象使用后被正确销毁,避免内存泄漏。
  • 合理的阻塞等待:加入Thread.Sleep(10)避免循环占用过多CPU资源,防止Warudo主线程卡顿。
  • 错误处理:明确判断请求结果,打印错误日志便于排查问题,避免空值的模糊性。
  • 正确的请求头设置:GET请求不需要Content-Type头(该头用于标记发送的请求体格式),改用Accept头告知服务器你期望接收JSON响应,符合HTTP规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:16:09