com.alicizax.unity/Runtime/Utility/Utility.Http.cs
2025-04-23 13:51:30 +08:00

97 lines
3.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
{
// 手动处理 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;
}
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;
}
}
}
}
}