97 lines
3.8 KiB
C#
97 lines
3.8 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// 发送 GET 请求
|
||
/// </summary>
|
||
public static async UniTask<string> Get(string url, float timeout = 5f)
|
||
{
|
||
using var cts = CreateTimeoutTokenSource(timeout);
|
||
using var request = UnityWebRequest.Get(url);
|
||
return await SendRequest(request, cts.Token);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 发送 JSON 格式的 POST 请求(服务端需用 [FromBody] 接收)
|
||
/// </summary>
|
||
public static async UniTask<string> PostJson(string url, object jsonData, float timeout = 5f)
|
||
{
|
||
using var cts = CreateTimeoutTokenSource(timeout);
|
||
var json = Utility.Json.ToJson(jsonData);
|
||
using var request = CreateJsonPostRequest(url, json);
|
||
return await SendRequest(request, cts.Token);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 发送表单格式的 POST 请求(x-www-form-urlencoded)
|
||
/// </summary>
|
||
public static async UniTask<string> PostForm(string url, Dictionary<string, string> formData, float timeout = 5f)
|
||
{
|
||
using var cts = CreateTimeoutTokenSource(timeout);
|
||
using var request = UnityWebRequest.Post(url, formData);
|
||
return await SendRequest(request, cts.Token);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 发送多部分表单的 POST 请求(multipart/form-data,支持文件上传)
|
||
/// </summary>
|
||
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)
|
||
{
|
||
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<string> 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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|