using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; using Cysharp.Threading.Tasks; using Newtonsoft.Json; using Script; using UnityEngine; using UnityEngine.Networking; namespace Stary.Evo { public static class WebRequestSystem { private static string authorization; private static byte[] certificateData; static WebRequestSystem() { #if UNITY_EDITOR authorization = CustomEditorPrefs.GetString("Authorization"); #else authorization = CustomPlayerPrefs.GetString("Authorization"); #endif } private static async UniTask GetCertificateData() { var certPath = Path.Combine(Application.streamingAssetsPath, "server.crt"); if (certificateData == null) { #if UNITY_ANDROID && !UNITY_EDITOR // Android平台使用UnityWebRequest读取 var webRequest = UnityWebRequest.Get(certPath); await webRequest.SendWebRequest(); if (webRequest.result == UnityWebRequest.Result.Success) { certificateData = webRequest.downloadHandler.data; } #else // 其他平台使用File读取 if (File.Exists(certPath)) { certificateData = File.ReadAllBytes(certPath); } #endif } } public static async Task Login(string url, string username, string password) { var data = new { username, password, roleType = "client" }; var postData = JsonConvert.SerializeObject(data); try { using var webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST); webRequest.downloadHandler = new DownloadHandlerBuffer(); if (string.IsNullOrEmpty(postData)) { Debug.LogError("WebRequestSystem.Login postData is null"); return false; } var postBytes = Encoding.UTF8.GetBytes(postData); webRequest.uploadHandler = new UploadHandlerRaw(postBytes); webRequest.SetRequestHeader("Content-Type", "application/json"); webRequest.timeout = 10; await webRequest.SendWebRequest(); webRequest.uploadHandler?.Dispose(); // 更新错误检查方式 if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError) { Debug.LogError(webRequest.error); } else { var authResponse = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); Debug.Log("UnityEvo:ResultMessageEntity" + authResponse.data); if (authResponse.code == 200) { var authResponseData = JsonConvert.DeserializeObject(authResponse.data.ToString()); Debug.Log("UnityEvo:AuthenticationResponse" + authResponseData.Token); authorization = authResponseData.Token; #if UNITY_EDITOR CustomEditorPrefs.SetString("Authorization", authorization); #else CustomPlayerPrefs.SetString("Authorization",authorization); #endif Debug.Log("UnityEvo:登录成功"); return true; } } return false; } catch (Exception e) { Debug.LogError("UnityEvo:WebRequestSystem.Login" + e.Message); return false; } } /// /// GET请求数据 /// /// 请求数据的URL地址 /// token验证的参数,此处为authorization /// public static async Task GetValidateToken(string url) { #if UNITY_EDITOR authorization = CustomEditorPrefs.GetString("Authorization"); #else authorization = CustomPlayerPrefs.GetString("Authorization"); #endif try { using var webRequest = new UnityWebRequest($"{url}?token={authorization}", UnityWebRequest.kHttpVerbGET); //using UnityWebRequest webRequest = UnityWebRequest.Get($"{url}?token={authorization}"); webRequest.downloadHandler = new DownloadHandlerBuffer(); webRequest.timeout = 10; await webRequest.SendWebRequest(); // 增强错误处理 if (webRequest.result != UnityWebRequest.Result.Success) { var errorMsg = $"HTTP {webRequest.responseCode}\n" + $"URL: {url}\n" + $"Error: {webRequest.error}\n" + $"Response: {webRequest.downloadHandler.text}"; Debug.LogError(errorMsg); return false; } var resultMessageEntity = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); if (resultMessageEntity.code == 200) return true; // 添加返回值 return false; } catch (Exception e) { Debug.LogError("UnityEvo:WebRequestSystem.GetValidateToken" + e.Message); return false; } } /// /// POST请求数据 /// /// 获取Token值的服务URL地址(很重要) /// 传入请求的参数,此处参数为JOSN格式 /// public static async Task PostFile(string url, string[] path, Dictionary headers = null, Action uploadProgress = null) { //UnityWebRequest[] files = new UnityWebRequest[3]; var form = new WWWForm(); for (var i = 0; i < path.Length; i++) { var bytes = await File.ReadAllBytesAsync(path[i]); form.AddBinaryData("files[]", bytes, Path.GetFileName(path[i])); } try { using var webRequest = UnityWebRequest.Post(url, form); webRequest.SetRequestHeader("Authorization", authorization); if (headers != null) foreach (var header in headers) webRequest.SetRequestHeader(header.Key, header.Value); webRequest.disposeUploadHandlerOnDispose = true; webRequest.disposeDownloadHandlerOnDispose = true; webRequest.disposeCertificateHandlerOnDispose = true; webRequest.timeout = 60; // 发送请求但不等待完成 var operation = webRequest.SendWebRequest(); // 轮询获取上传进度 while (!operation.isDone) { // 调用进度回调函数 uploadProgress?.Invoke(webRequest.uploadProgress); // 等待一帧,避免阻塞 await UniTask.Yield(); } webRequest.uploadHandler?.Dispose(); // 更新错误检查方式 if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError) { Debug.LogError(webRequest.error); return new ResultMessageEntity { code = 5001, message = webRequest.error }; } var resultMessageEntity = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); if (resultMessageEntity.code != 200) Debug.LogError("上传异常,无文件数据返回!!"); return resultMessageEntity; } catch (Exception e) { Debug.LogError("UnityEvo:WebRequestSystem.PostFile" + e.Message); return new ResultMessageEntity { code = 5001, message = e.Message }; } } /// /// GET请求数据 /// /// 请求数据的URL地址 /// token验证的参数,此处为authorization /// public static async Task GetFile(string url, string tempPath, Action downloadProgress = null) { try { await GetCertificateData(); using var webRequest = UnityWebRequest.Get(url); webRequest.downloadHandler = new DownloadHandlerFile(tempPath); webRequest.certificateHandler = new SelfSignedCertHandler(certificateData); if (authorization != null) webRequest.SetRequestHeader("Authorization", authorization); // 修正请求头名称规范 var operation = webRequest.SendWebRequest(); while (!operation.isDone) { downloadProgress?.Invoke(webRequest.downloadProgress); await UniTask.Yield(); } // 增强错误处理 if (webRequest.result != UnityWebRequest.Result.Success) { var errorMsg = $"HTTP {webRequest.responseCode}\n" + $"URL: {url}\n" + $"Error: {webRequest.error}\n"; Debug.LogError(errorMsg); return new ResultMessageEntity { code = 5001, message = errorMsg }; } return new ResultMessageEntity { code = 200, message = "下载成功" }; } catch (Exception e) { Debug.LogError("UnityEvo:WebRequestSystem.GetFile" + e.Message); return new ResultMessageEntity { code = 5001, message = e.Message }; } } /// /// GET请求数据 /// 携带数据:否 /// 幂等性:是 /// /// 请求数据的URL地址 /// 请求数据的路径 /// public static async Task Get(string url, string path) { try { await GetCertificateData(); var fullUrl = url.TrimEnd('/') + "/" + path.TrimStart('/'); using var webRequest = new UnityWebRequest(fullUrl, UnityWebRequest.kHttpVerbGET); webRequest.downloadHandler = new DownloadHandlerBuffer(); webRequest.certificateHandler = new SelfSignedCertHandler(certificateData); if (authorization != null) webRequest.SetRequestHeader("Authorization", authorization); // 修正请求头名称规范 webRequest.timeout = 20; await webRequest.SendWebRequest(); // 增强错误处理 if (webRequest.result != UnityWebRequest.Result.Success) { var errorMsg = $"HTTP {webRequest.responseCode}\n" + $"URL: {url}\n" + $"Error: {webRequest.error}\n" + $"Response: {webRequest.downloadHandler.text}"; Debug.LogError(errorMsg); } var resultMessageEntity = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); return resultMessageEntity; } catch (Exception e) { Debug.LogError("UnityEvo:WebRequestSystem.Get" + e.Message); } return default; } /// /// POST请求数据 /// 携带数据:是 /// 幂等性:否 /// /// 获取Token值的服务URL地址(很重要) /// 传入请求的参数,此处参数为JOSN格式 /// public static async Task Post(string url, string postData) { try { using var webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST); // #if UNITY_2021_3_OR_NEWER // using (UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData)) //第二种写法此行注释 // #else // using (UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData)) //第二种写法此行注释 // #endif webRequest.downloadHandler = new DownloadHandlerBuffer(); var postBytes = Encoding.UTF8.GetBytes(postData); webRequest.uploadHandler = new UploadHandlerRaw(postBytes); webRequest.SetRequestHeader("Content-Type", "application/json"); webRequest.SetRequestHeader("Authorization", authorization); webRequest.disposeUploadHandlerOnDispose = true; webRequest.disposeDownloadHandlerOnDispose = true; webRequest.disposeCertificateHandlerOnDispose = true; webRequest.timeout = 30; await webRequest.SendWebRequest(); webRequest.uploadHandler?.Dispose(); // 更新错误检查方式 if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError) { Debug.LogError(webRequest.error); return new ResultMessageEntity { code = 5001, message = webRequest.error }; } var resultMessageEntity = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); if (resultMessageEntity.code != 200) Debug.LogError(resultMessageEntity.message); return resultMessageEntity; } catch (Exception e) { Debug.LogError("UnityEvo:WebRequestSystem.Post" + e.Message); return new ResultMessageEntity { code = 5001, message = e.Message }; } } /// /// Delete请求数据 /// 携带数据:否 /// 幂等性:是 /// /// 请求数据的URL地址 /// 请求数据的路径 /// public static async Task Delete(string url, string path) { try { // 修复URL拼接 var fullUrl = url.TrimEnd('/') + "/" + path.TrimStart('/'); using var webRequest = new UnityWebRequest(fullUrl, UnityWebRequest.kHttpVerbDELETE); webRequest.downloadHandler = new DownloadHandlerBuffer(); if (authorization != null) webRequest.SetRequestHeader("Authorization", authorization); // 修正请求头名称规范 webRequest.timeout = 20; await webRequest.SendWebRequest(); // 增强错误处理 if (webRequest.result != UnityWebRequest.Result.Success) { var errorMsg = $"HTTP {webRequest.responseCode}\n" + $"URL: {url}\n" + $"Error: {webRequest.error}\n" + $"Response: {webRequest.downloadHandler.text}"; Debug.LogError(errorMsg); return new ResultMessageEntity { code = 5001, message = errorMsg }; } // 修复空响应处理 var responseText = webRequest.downloadHandler.text; if (string.IsNullOrEmpty(responseText)) return new ResultMessageEntity { code = 200, message = "删除成功" }; var resultMessageEntity = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); if (resultMessageEntity.code != 200) Debug.LogError(resultMessageEntity.message); return resultMessageEntity; } catch (Exception e) { Debug.LogError("UnityEvo:WebRequestSystem.Get" + e.Message); return new ResultMessageEntity { code = 5001, message = e.Message }; } } /// /// PUT请求数据 /// 携带数据:是 /// 幂等性:是 /// /// 请求数据的URL地址 /// 请求数据的路径 /// 要更新的数据(JSON格式) /// public static async Task Put(string url, string putData) { try { // 修复URL拼接 using var webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPUT); // 设置上传处理器 var putBytes = Encoding.UTF8.GetBytes(putData); webRequest.uploadHandler = new UploadHandlerRaw(putBytes); webRequest.downloadHandler = new DownloadHandlerBuffer(); // 设置请求头 webRequest.SetRequestHeader("Content-Type", "application/json"); if (authorization != null) webRequest.SetRequestHeader("Authorization", authorization); // 修正请求头名称规范 webRequest.timeout = 20; await webRequest.SendWebRequest(); // 增强错误处理 if (webRequest.result != UnityWebRequest.Result.Success) { var errorMsg = $"HTTP {webRequest.responseCode}\n" + $"URL: {url}\n" + $"Error: {webRequest.error}\n" + $"Response: {webRequest.downloadHandler.text}"; Debug.LogError(errorMsg); return new ResultMessageEntity { code = 5001, message = errorMsg }; } // 处理空响应 var responseText = webRequest.downloadHandler.text; if (string.IsNullOrEmpty(responseText)) return new ResultMessageEntity { code = 200, message = "更新成功" }; var resultMessageEntity = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); if (resultMessageEntity.code != 200) Debug.LogError(resultMessageEntity.message); return resultMessageEntity; } catch (Exception e) { Debug.LogError("UnityEvo:WebRequestSystem.Put" + e.Message); return new ResultMessageEntity { code = 5001, message = e.Message }; } } public static async UniTask Upload(string filePath, string serverBaseUrl, string meetingId, string userId, MainPanel.UsersItem host, List participants) { await GetCertificateData(); var bytes = File.ReadAllBytes(filePath); var fileName = Path.GetFileName(filePath); var ext = Path.GetExtension(fileName).ToLowerInvariant(); var mimeType = ext == ".webm" ? "video/webm" : "video/mp4"; var form = new List { new MultipartFormDataSection("meetingId", meetingId), new MultipartFormDataSection("userId", userId), new MultipartFormDataSection("filename", fileName), new MultipartFormFileSection("recording", bytes, fileName, mimeType), new MultipartFormDataSection("host", JsonConvert.SerializeObject(host)), new MultipartFormDataSection("participants", JsonConvert.SerializeObject(participants)) }; using var request = UnityWebRequest.Post($"{serverBaseUrl}/api/recordings", form); request.timeout = 300; request.certificateHandler = new SelfSignedCertHandler(certificateData); await request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) Debug.LogError($"上传失败: {request.error}, body={request.downloadHandler.text}"); else Debug.Log($"上传成功: {request.downloadHandler.text}"); } } }