修改
This commit is contained in:
parent
9e3505bc27
commit
caf1f11371
@ -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();
|
// 手动处理 JSON(Unity 未提供直接方法)
|
||||||
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)
|
|
||||||
|
if (request.result != UnityWebRequest.Result.Success)
|
||||||
{
|
{
|
||||||
Log.Warning($"HttpPost {unityWebRequest.url} be canceled!");
|
Debug.LogError($"HTTP Error ({request.responseCode}): {request.error}");
|
||||||
unityWebRequest.Dispose();
|
|
||||||
return string.Empty;
|
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;
|
return request.downloadHandler.text;
|
||||||
unityWebRequest.Dispose();
|
}
|
||||||
return ret;
|
catch (OperationCanceledException) when (token.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
Debug.LogWarning("Request timed out.");
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user