This commit is contained in:
陈思海 2025-04-23 13:50:17 +08:00
parent 9e3505bc27
commit caf1f11371

View File

@ -9,105 +9,87 @@ namespace AlicizaX
{
public static partial class Utility
{
/// <summary>
/// Http 相关的实用函数。
/// </summary>
public static partial class Http
{
/// <summary>
/// GET请求与获取结果。
/// 发送 GET 请求
/// </summary>
/// <param name="url">网络URL。</param>
/// <param name="timeout">超时时间。</param>
/// <returns>请求结果。</returns>
public static async UniTask<string> Get(string url, float timeout = 5f)
{
var cts = new CancellationTokenSource();
cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout));
using UnityWebRequest unityWebRequest = UnityWebRequest.Get(url);
return await SendWebRequest(unityWebRequest, cts);
using var cts = CreateTimeoutTokenSource(timeout);
using var request = UnityWebRequest.Get(url);
return await SendRequest(request, cts.Token);
}
/// <summary>
/// Post请求与获取结果.
/// 发送 JSON 格式的 POST 请求(服务端需用 [FromBody] 接收)
/// </summary>
/// <param name="url">网络URL。</param>
/// <param name="postData">Post数据。</param>
/// <param name="timeout">超时时间。</param>
/// <returns>请求结果。</returns>
public static async UniTask<string> Post(string url, string postData, float timeout = 5f)
public static async UniTask<string> 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);
}
/// <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));
using UnityWebRequest unityWebRequest = UnityWebRequest.PostWwwForm(url, postData);
return await SendWebRequest(unityWebRequest, cts);
return cts;
}
/// <summary>
/// Post请求与获取结果.
/// </summary>
/// <param name="url">网络URL。</param>
/// <param name="formFields">Post数据。</param>
/// <param name="timeout">超时时间。</param>
/// <returns>请求结果。</returns>
public static async UniTask<string> Post(string url, Dictionary<string, string> formFields, float timeout = 5f)
private static UnityWebRequest CreateJsonPostRequest(string url, string json)
{
var cts = new CancellationTokenSource();
cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout));
using UnityWebRequest unityWebRequest = UnityWebRequest.Post(url, formFields);
return await SendWebRequest(unityWebRequest, cts);
// 手动处理 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;
}
/// <summary>
/// Post请求与获取结果.
/// </summary>
/// <param name="url">网络URL。</param>
/// <param name="formData">Post数据。</param>
/// <param name="timeout">超时时间。</param>
/// <returns>请求结果。</returns>
public static async UniTask<string> Post(string url, WWWForm formData, float timeout = 5f)
{
var cts = new CancellationTokenSource();
cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout));
using UnityWebRequest unityWebRequest = UnityWebRequest.Post(url, formData);
return await SendWebRequest(unityWebRequest, cts);
}
/// <summary>
/// 抛出网络请求。
/// </summary>
/// <param name="unityWebRequest">UnityWebRequest。</param>
/// <param name="cts">CancellationTokenSource。</param>
/// <returns>请求结果。</returns>
public static async UniTask<string> SendWebRequest(UnityWebRequest unityWebRequest, CancellationTokenSource cts)
private static async UniTask<string> SendRequest(UnityWebRequest request, CancellationToken token)
{
try
{
var (isCanceled, _) = await unityWebRequest.SendWebRequest().WithCancellation(cts.Token).SuppressCancellationThrow();
if (isCanceled)
await request.SendWebRequest().WithCancellation(token);
if (request.result != UnityWebRequest.Result.Success)
{
Log.Warning($"HttpPost {unityWebRequest.url} be canceled!");
unityWebRequest.Dispose();
Debug.LogError($"HTTP Error ({request.responseCode}): {request.error}");
return string.Empty;
}
}
catch (OperationCanceledException ex)
{
if (ex.CancellationToken == cts.Token)
{
Log.Warning("HttpPost Timeout");
unityWebRequest.Dispose();
return string.Empty;
}
}
string ret = unityWebRequest.downloadHandler.text;
unityWebRequest.Dispose();
return ret;
return request.downloadHandler.text;
}
catch (OperationCanceledException) when (token.IsCancellationRequested)
{
Debug.LogWarning("Request timed out.");
return string.Empty;
}
}
}
}