using System; using System.Collections.Generic; using System.Threading; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; namespace AlicizaX.Runtime { public static partial class Utility { /// /// Http 相关的实用函数。 /// public static partial class Http { /// /// GET请求与获取结果。 /// /// 网络URL。 /// 超时时间。 /// 请求结果。 public static async UniTask 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); } /// /// Post请求与获取结果. /// /// 网络URL。 /// Post数据。 /// 超时时间。 /// 请求结果。 public static async UniTask Post(string url, string postData, float timeout = 5f) { var cts = new CancellationTokenSource(); cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout)); using UnityWebRequest unityWebRequest = UnityWebRequest.PostWwwForm(url, postData); return await SendWebRequest(unityWebRequest, cts); } /// /// Post请求与获取结果. /// /// 网络URL。 /// Post数据。 /// 超时时间。 /// 请求结果。 public static async UniTask Post(string url, Dictionary formFields, float timeout = 5f) { var cts = new CancellationTokenSource(); cts.CancelAfterSlim(TimeSpan.FromSeconds(timeout)); using UnityWebRequest unityWebRequest = UnityWebRequest.Post(url, formFields); return await SendWebRequest(unityWebRequest, cts); } /// /// Post请求与获取结果. /// /// 网络URL。 /// Post数据。 /// 超时时间。 /// 请求结果。 public static async UniTask 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); } /// /// 抛出网络请求。 /// /// UnityWebRequest。 /// CancellationTokenSource。 /// 请求结果。 public static async UniTask SendWebRequest(UnityWebRequest unityWebRequest, CancellationTokenSource cts) { try { var (isCanceled, _) = await unityWebRequest.SendWebRequest().WithCancellation(cts.Token).SuppressCancellationThrow(); 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; unityWebRequest.Dispose(); return ret; } } } }