com.alicizax.unity/Runtime/Utility/Utility.Http.cs

97 lines
3.8 KiB
C#
Raw Normal View History

2025-02-07 16:04:12 +08:00
using System;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
2025-03-24 13:16:51 +08:00
namespace AlicizaX
2025-02-07 16:04:12 +08:00
{
public static partial class Utility
{
public static partial class Http
{
/// <summary>
2025-04-23 13:50:17 +08:00
/// 发送 GET 请求
2025-02-07 16:04:12 +08:00
/// </summary>
public static async UniTask<string> Get(string url, float timeout = 5f)
{
2025-04-23 13:50:17 +08:00
using var cts = CreateTimeoutTokenSource(timeout);
using var request = UnityWebRequest.Get(url);
return await SendRequest(request, cts.Token);
2025-02-07 16:04:12 +08:00
}
/// <summary>
2025-04-23 13:50:17 +08:00
/// 发送 JSON 格式的 POST 请求(服务端需用 [FromBody] 接收)
2025-02-07 16:04:12 +08:00
/// </summary>
2025-04-23 13:50:17 +08:00
public static async UniTask<string> PostJson(string url, object jsonData, float timeout = 5f)
2025-02-07 16:04:12 +08:00
{
2025-04-23 13:50:17 +08:00
using var cts = CreateTimeoutTokenSource(timeout);
var json = JsonUtility.ToJson(jsonData);
using var request = CreateJsonPostRequest(url, json);
return await SendRequest(request, cts.Token);
2025-02-07 16:04:12 +08:00
}
/// <summary>
2025-04-23 13:50:17 +08:00
/// 发送表单格式的 POST 请求x-www-form-urlencoded
2025-02-07 16:04:12 +08:00
/// </summary>
2025-04-23 13:50:17 +08:00
public static async UniTask<string> PostForm(string url, Dictionary<string, string> formData, float timeout = 5f)
2025-02-07 16:04:12 +08:00
{
2025-04-23 13:50:17 +08:00
using var cts = CreateTimeoutTokenSource(timeout);
using var request = UnityWebRequest.Post(url, formData);
return await SendRequest(request, cts.Token);
2025-02-07 16:04:12 +08:00
}
/// <summary>
2025-04-23 13:50:17 +08:00
/// 发送多部分表单的 POST 请求multipart/form-data支持文件上传
2025-02-07 16:04:12 +08:00
/// </summary>
2025-04-23 13:50:17 +08:00
public static async UniTask<string> 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)
2025-02-07 16:04:12 +08:00
{
var cts = new CancellationTokenSource();
cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout));
2025-04-23 13:50:17 +08:00
return cts;
}
2025-02-07 16:04:12 +08:00
2025-04-23 13:50:17 +08:00
private static UnityWebRequest CreateJsonPostRequest(string url, string json)
{
// 手动处理 JSONUnity 未提供直接方法)
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;
2025-02-07 16:04:12 +08:00
}
2025-04-23 13:50:17 +08:00
private static async UniTask<string> SendRequest(UnityWebRequest request, CancellationToken token)
2025-02-07 16:04:12 +08:00
{
try
{
2025-04-23 13:50:17 +08:00
await request.SendWebRequest().WithCancellation(token);
if (request.result != UnityWebRequest.Result.Success)
2025-02-07 16:04:12 +08:00
{
2025-04-23 13:50:17 +08:00
Debug.LogError($"HTTP Error ({request.responseCode}): {request.error}");
2025-02-07 16:04:12 +08:00
return string.Empty;
}
2025-04-23 13:50:17 +08:00
return request.downloadHandler.text;
2025-02-07 16:04:12 +08:00
}
2025-04-23 13:50:17 +08:00
catch (OperationCanceledException) when (token.IsCancellationRequested)
2025-02-07 16:04:12 +08:00
{
2025-04-23 13:50:17 +08:00
Debug.LogWarning("Request timed out.");
return string.Empty;
2025-02-07 16:04:12 +08:00
}
}
}
}
2025-03-24 13:16:51 +08:00
}