using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Cysharp.Threading.Tasks; using Newtonsoft.Json; using UnityEditor; using UnityEngine; using UnityEngine.Networking; namespace Stary.Evo { public static class WebRequestSystem { private static string authorization; static WebRequestSystem() { #if UNITY_EDITOR authorization = EditorPrefs.GetString("Authorization"); #else authorization = PlayerPrefs.GetString("Authorization"); #endif } public static async Task Login(string url, string username, string password) { var data = new { username = username, password = password, roleType = "client", }; string postData = JsonConvert.SerializeObject(data); try { using UnityWebRequest webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST); webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); if (string.IsNullOrEmpty(postData)) { Debug.LogError("WebRequestSystem.Login postData is null"); return false; } byte[] postBytes = System.Text.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 { ResultMessageEntity authResponse = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); Debug.Log("UnityEvo:ResultMessageEntity" + authResponse.data); if (authResponse.code == 200) { AuthenticationResponse authResponseData = JsonConvert.DeserializeObject(authResponse.data.ToString()); Debug.Log("UnityEvo:AuthenticationResponse" + authResponseData.Token); authorization = authResponseData.Token; #if UNITY_EDITOR EditorPrefs.SetString("Authorization", authorization); #else PlayerPrefs.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 = EditorPrefs.GetString("Authorization"); #else authorization = PlayerPrefs.GetString("Authorization"); #endif try { using UnityWebRequest webRequest = new UnityWebRequest($"{url}/{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; } ResultMessageEntity 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,Action uploadProgress = null) { if (!GetTokenState()) { Debug.LogError("用户未登录,请先登录"); return new ResultMessageEntity() { code = 2001, message = "用户未登录,请先登录" }; } //UnityWebRequest[] files = new UnityWebRequest[3]; WWWForm form = new WWWForm(); for (int i = 0; i < path.Length; i++) { byte[] bytes = await File.ReadAllBytesAsync(path[i]); form.AddBinaryData("files[]", bytes, Path.GetFileName(path[i])); } try { using UnityWebRequest webRequest = UnityWebRequest.Post(url, form); webRequest.SetRequestHeader("Authorization", authorization); 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 }; } else { ResultMessageEntity 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) { if (!GetTokenState()) { Debug.LogError("用户未登录,请先登录"); return new ResultMessageEntity() { code = 2001, message = "用户未登录,请先登录" }; } try { using UnityWebRequest webRequest = UnityWebRequest.Get(url); webRequest.downloadHandler = new DownloadHandlerFile(tempPath); 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 }; } else { 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) { if (!GetTokenState()) { Debug.LogError("用户未登录,请先登录"); return new ResultMessageEntity() { code = 2001, message = "用户未登录,请先登录" }; } try { string fullUrl = url.TrimEnd('/') + "/" + path.TrimStart('/'); using UnityWebRequest webRequest = new UnityWebRequest(fullUrl, UnityWebRequest.kHttpVerbGET); 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 }; } ResultMessageEntity 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 }; } } /// /// POST请求数据 /// 携带数据:是 /// 幂等性:否 /// /// 获取Token值的服务URL地址(很重要) /// 传入请求的参数,此处参数为JOSN格式 /// public static async Task Post(string url, string postData) { if (!GetTokenState()) { Debug.LogError("用户未登录,请先登录"); return new ResultMessageEntity() { code = 2001, message = "用户未登录,请先登录" }; } try { using UnityWebRequest 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(); byte[] postBytes = System.Text.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 }; } else { ResultMessageEntity 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) { if (!GetTokenState()) { Debug.LogError("用户未登录,请先登录"); return new ResultMessageEntity() { code = 2001, message = "用户未登录,请先登录" }; } try { // 修复URL拼接 string fullUrl = url.TrimEnd('/') + "/" + path.TrimStart('/'); using UnityWebRequest 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 }; } // 修复空响应处理 string responseText = webRequest.downloadHandler.text; if (string.IsNullOrEmpty(responseText)) { return new ResultMessageEntity() { code = 200, message = "删除成功" }; } ResultMessageEntity 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) { if (!GetTokenState()) { Debug.LogError("用户未登录,请先登录"); return new ResultMessageEntity() { code = 2001, message = "用户未登录,请先登录" }; } try { // 修复URL拼接 using UnityWebRequest webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPUT); // 设置上传处理器 byte[] putBytes = System.Text.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 }; } // 处理空响应 string responseText = webRequest.downloadHandler.text; if (string.IsNullOrEmpty(responseText)) { return new ResultMessageEntity() { code = 200, message = "更新成功" }; } ResultMessageEntity 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 bool GetTokenState() { if (string.IsNullOrEmpty(authorization)) { return false; } return true; } } }