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

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);
        }
    }

文件下载

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 @ 2024-09-30 14:24  jeoyao  阅读(40)  评论(0编辑  收藏  举报