修改
This commit is contained in:
parent
9e3505bc27
commit
caf1f11371
@ -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);
|
||||
// 手动处理 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;
|
||||
}
|
||||
|
||||
/// <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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user