Unity编辑器扩展-基于UniTask的Http请求和下载

Copy
public class HttpHelper { public static async UniTask<(bool, string)> RequestGetUrlAsync(string url, bool debug = false) { Debug.Log($"req get url:{url}"); UnityWebRequest req = null; req = UnityWebRequest.Get(url); var rlt = await req.SendWebRequest(); await UniTask.WaitUntil(()=>rlt.isDone); var error = rlt.error; if (!string.IsNullOrEmpty(error)) { Debug.LogError($"resp error:{error}"); return (false, error); } var text = rlt.downloadHandler.text; if (debug) { Debug.Log($"resp ok:{text}"); } return (true,text); } public static async UniTask<(bool, string)> RequestPostUrlAsync(string url,string data) { Debug.Log($"req post url:{url}"); UnityWebRequest req = null; req = UnityWebRequest.Post(url,data); var rlt = await req.SendWebRequest(); await UniTask.WaitUntil(()=>rlt.isDone); //test // await UniTask.WaitForSeconds(2); var error = rlt.error; if (!string.IsNullOrEmpty(error)) { return (false, error); } return (true,rlt.downloadHandler.text); } }

文件下载

Copy
public class HttpFileDownloader { // 进度报告的委托 public delegate void ProgressReportDelegate(float progress); private string _url; private string _filePath; private ProgressReportDelegate _progressCallback; public HttpFileDownloader(string url, string filePath,ProgressReportDelegate progressCallback = null) { _url = url; _filePath = filePath; _progressCallback = progressCallback; } public async UniTask<(bool,string)> DownloadAsync(CancellationToken cancellationToken = default) { try { using (var webRequest = UnityWebRequest.Get(_url)) { // 设置下载进度回调 if (_progressCallback != null) { webRequest.downloadHandler = new DownloadHandlerBuffer(); } // 创建进度报告的 UniTask UniTask progressReportTask = UniTask.Create(async () => { while (!webRequest.isDone) { _progressCallback?.Invoke(webRequest.downloadProgress); await UniTask.Yield(cancellationToken); } }); // 发送请求并等待完成,同时监听取消信号 var downloadTask = webRequest.SendWebRequest().ToUniTask(cancellationToken: cancellationToken); await UniTask.WhenAny(downloadTask, progressReportTask); // 检查是否被取消 if (cancellationToken.IsCancellationRequested) { webRequest.Abort(); return (false, "download aborted"); } // 等待进度报告任务完成 if (_progressCallback != null) { await progressReportTask; } if (webRequest.isHttpError || webRequest.isNetworkError || !string.IsNullOrEmpty(webRequest.error)) { Debug.LogError($"下载失败: {webRequest.error}"); return (false, webRequest.error); } byte[] results = webRequest.downloadHandler.data; // 确保目录存在 string directory = Path.GetDirectoryName(_filePath); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } // 写入文件 File.WriteAllBytes(_filePath, results); Debug.Log($"文件已成功下载到: {_filePath}"); return (true, ""); } } catch (OperationCanceledException) { var msg = "下载已取消"; Debug.Log(msg); return (false, msg); } catch (Exception ex) { var msg = ex.Message; Debug.LogError(msg); return (false, msg); } } }
posted @   jeoyao  阅读(111)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示