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 public static partial class Utility
{ {
/// <summary>
/// Http 相关的实用函数。
/// </summary>
public static partial class Http public static partial class Http
{ {
/// <summary> /// <summary>
/// GET请求与获取结果。 /// 发送 GET 请求
/// </summary> /// </summary>
/// <param name="url">网络URL。</param>
/// <param name="timeout">超时时间。</param>
/// <returns>请求结果。</returns>
public static async UniTask<string> Get(string url, float timeout = 5f) public static async UniTask<string> Get(string url, float timeout = 5f)
{ {
var cts = new CancellationTokenSource(); using var cts = CreateTimeoutTokenSource(timeout);
cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout)); using var request = UnityWebRequest.Get(url);
return await SendRequest(request, cts.Token);
using UnityWebRequest unityWebRequest = UnityWebRequest.Get(url);
return await SendWebRequest(unityWebRequest, cts);
} }
/// <summary> /// <summary>
/// Post请求与获取结果. /// 发送 JSON 格式的 POST 请求(服务端需用 [FromBody] 接收)
/// </summary> /// </summary>
/// <param name="url">网络URL。</param> public static async UniTask<string> PostJson(string url, object jsonData, float timeout = 5f)
/// <param name="postData">Post数据。</param> {
/// <param name="timeout">超时时间。</param> using var cts = CreateTimeoutTokenSource(timeout);
/// <returns>请求结果。</returns> var json = JsonUtility.ToJson(jsonData);
public static async UniTask<string> Post(string url, string postData, float timeout = 5f) 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(); var cts = new CancellationTokenSource();
cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout)); cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout));
return cts;
using UnityWebRequest unityWebRequest = UnityWebRequest.PostWwwForm(url, postData);
return await SendWebRequest(unityWebRequest, cts);
} }
/// <summary> private static UnityWebRequest CreateJsonPostRequest(string url, string json)
/// 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)
{ {
var cts = new CancellationTokenSource(); // 手动处理 JSONUnity 未提供直接方法)
cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout)); var request = new UnityWebRequest(url, "POST");
byte[] jsonBytes = System.Text.Encoding.UTF8.GetBytes(json);
using UnityWebRequest unityWebRequest = UnityWebRequest.Post(url, formFields); request.uploadHandler = new UploadHandlerRaw(jsonBytes);
return await SendWebRequest(unityWebRequest, cts); request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
return request;
} }
/// <summary> private static async UniTask<string> SendRequest(UnityWebRequest request, CancellationToken token)
/// 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)
{ {
try try
{ {
var (isCanceled, _) = await unityWebRequest.SendWebRequest().WithCancellation(cts.Token).SuppressCancellationThrow(); await request.SendWebRequest().WithCancellation(token);
if (isCanceled)
{
Log.Warning($"HttpPost {unityWebRequest.url} be canceled!");
unityWebRequest.Dispose();
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; if (request.result != UnityWebRequest.Result.Success)
unityWebRequest.Dispose(); {
return ret; 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;
}
} }
} }
} }