不使用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
相关产品推荐
相关产品推荐

