using System;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
namespace AlicizaX
{
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;
}
}
}
}