using System; using System.Collections.Generic; using System.Threading; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; namespace AlicizaX { public static partial class Utility { public static partial class Http { /// /// 发送 GET 请求 /// public static async UniTask Get(string url, float timeout = 5f) { using var cts = CreateTimeoutTokenSource(timeout); using var request = UnityWebRequest.Get(url); return await SendRequest(request, cts.Token); } /// /// 发送 JSON 格式的 POST 请求(服务端需用 [FromBody] 接收) /// public static async UniTask PostJson(string url, object jsonData, float timeout = 5f) { using var cts = CreateTimeoutTokenSource(timeout); var json = JsonUtility.ToJson(jsonData); using var request = CreateJsonPostRequest(url, json); return await SendRequest(request, cts.Token); } /// /// 发送表单格式的 POST 请求(x-www-form-urlencoded) /// public static async UniTask PostForm(string url, Dictionary formData, float timeout = 5f) { using var cts = CreateTimeoutTokenSource(timeout); using var request = UnityWebRequest.Post(url, formData); return await SendRequest(request, cts.Token); } /// /// 发送多部分表单的 POST 请求(multipart/form-data,支持文件上传) /// public static async UniTask PostMultipart(string url, WWWForm formData, float timeout = 5f) { using var cts = CreateTimeoutTokenSource(timeout); using var request = UnityWebRequest.Post(url, formData); return await SendRequest(request, cts.Token); } //----- 私有工具方法 ----- private static CancellationTokenSource CreateTimeoutTokenSource(float timeout) { var cts = new CancellationTokenSource(); cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout)); return cts; } private static UnityWebRequest CreateJsonPostRequest(string url, string json) { // 手动处理 JSON(Unity 未提供直接方法) var request = new UnityWebRequest(url, "POST"); byte[] jsonBytes = System.Text.Encoding.UTF8.GetBytes(json); request.uploadHandler = new UploadHandlerRaw(jsonBytes); request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Content-Type", "application/json"); return request; } private static async UniTask SendRequest(UnityWebRequest request, CancellationToken token) { try { await request.SendWebRequest().WithCancellation(token); if (request.result != UnityWebRequest.Result.Success) { Debug.LogError($"HTTP Error ({request.responseCode}): {request.error}"); return string.Empty; } return request.downloadHandler.text; } catch (OperationCanceledException) when (token.IsCancellationRequested) { Debug.LogWarning("Request timed out."); return string.Empty; } } } } }