using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
using System.Text;
using Newtonsoft.Json;
using UnityEngine.Events;
using System;
///
/// 异步封装unityWebRequest请求
///
public static class NetManager
{
///
/// 发送GET请求并返回结果
///
/// 返回结果的类型
/// 请求的URL
/// 请求完成后的回调函数
/// 请求结果
public static async UniTask Get(string url, UnityAction onComplete)
{
return await SendRequest(url, RequestType.GET, null, onComplete);
}
///
/// 发送GET请求
///
/// 请求的URL
/// 请求完成后的回调函数
public static async UniTask Get(string url, UnityAction onComplete)
{
await SendRequest(url, RequestType.GET, null, onComplete);
}
///
/// 发送POST请求并返回结果
///
/// 返回结果的类型
/// 请求的URL
/// 请求的负载数据
/// 请求完成后的回调函数
/// 请求结果
public static async UniTask Post(string url, object payload, UnityAction onComplete)
{
return await SendRequest(url, RequestType.POST, payload, onComplete);
}
///
/// 发送POST请求
///
/// 请求的URL
/// 请求的负载数据
/// 请求完成后的回调函数
public static async UniTask Post(string url, object payload, UnityAction onComplete)
{
await SendRequest(url, RequestType.POST, payload, onComplete);
}
///
/// 发送请求并返回结果
///
/// 返回结果的类型
/// 请求的URL
/// 请求类型
/// 请求的负载数据
/// 请求完成后的回调函数
/// 请求结果
private static async UniTask SendRequest(string url, RequestType type, object payload, UnityAction onComplete)
{
var request = CreateRequest(url, type, payload);
try
{
await request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
Debug.LogError($"Request failed: {request.error}");
throw new System.Exception($"Request failed: {request.error}");
}
T result = JsonConvert.DeserializeObject(request.downloadHandler.text);
onComplete?.Invoke(result);
return result;
}
catch (Exception ex)
{
Debug.LogError($"Exception during request: {ex.Message}");
throw;
}
finally
{
request.Dispose();
}
}
///
/// 发送请求
///
/// 请求的URL
/// 请求类型
/// 请求的负载数据
/// 请求完成后的回调函数
private static async UniTask SendRequest(string url, RequestType type, object payload, UnityAction onComplete)
{
var request = CreateRequest(url, type, payload);
try
{
await request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
Debug.LogError($"Request failed: {request.error}");
throw new System.Exception($"Request failed: {request.error}");
}
onComplete?.Invoke();
}
catch (Exception ex)
{
Debug.LogError($"Exception during request: {ex.Message}");
throw;
}
finally
{
request.Dispose();
}
}
///
/// 创建UnityWebRequest请求
///
/// 请求的URL
/// 请求类型
/// 请求的负载数据
/// UnityWebRequest实例
private static UnityWebRequest CreateRequest(string url, RequestType type = RequestType.GET, object data = null)
{
var request = new UnityWebRequest(url, type.ToString());
if (data != null)
{
string reqJson = JsonConvert.SerializeObject(data);
var bodyRaw = Encoding.UTF8.GetBytes(reqJson);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
}
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
//request.SetRequestHeader("auth_token", GlobalFlag.token);
return request;
}
///
/// 请求类型
///
public enum RequestType
{
GET = 0,
POST = 1
}
}