CultivationOfBrewing/Assets/Scripts/Project/ProjectBase/Utils/NetManager.cs

157 lines
5.3 KiB
C#

using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
using System.Text;
using Newtonsoft.Json;
using UnityEngine.Events;
using System;
/// <summary>
/// 异步封装unityWebRequest请求
/// </summary>
public static class NetManager
{
/// <summary>
/// 发送GET请求并返回结果
/// </summary>
/// <typeparam name="T">返回结果的类型</typeparam>
/// <param name="url">请求的URL</param>
/// <param name="onComplete">请求完成后的回调函数</param>
/// <returns>请求结果</returns>
public static async UniTask<T> Get<T>(string url, UnityAction<T> onComplete)
{
return await SendRequest<T>(url, RequestType.GET, null, onComplete);
}
/// <summary>
/// 发送GET请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="onComplete">请求完成后的回调函数</param>
public static async UniTask Get(string url, UnityAction onComplete)
{
await SendRequest(url, RequestType.GET, null, onComplete);
}
/// <summary>
/// 发送POST请求并返回结果
/// </summary>
/// <typeparam name="T">返回结果的类型</typeparam>
/// <param name="url">请求的URL</param>
/// <param name="payload">请求的负载数据</param>
/// <param name="onComplete">请求完成后的回调函数</param>
/// <returns>请求结果</returns>
public static async UniTask<T> Post<T>(string url, object payload, UnityAction<T> onComplete)
{
return await SendRequest<T>(url, RequestType.POST, payload, onComplete);
}
/// <summary>
/// 发送POST请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="payload">请求的负载数据</param>
/// <param name="onComplete">请求完成后的回调函数</param>
public static async UniTask Post(string url, object payload, UnityAction onComplete)
{
await SendRequest(url, RequestType.POST, payload, onComplete);
}
/// <summary>
/// 发送请求并返回结果
/// </summary>
/// <typeparam name="T">返回结果的类型</typeparam>
/// <param name="url">请求的URL</param>
/// <param name="type">请求类型</param>
/// <param name="payload">请求的负载数据</param>
/// <param name="onComplete">请求完成后的回调函数</param>
/// <returns>请求结果</returns>
private static async UniTask<T> SendRequest<T>(string url, RequestType type, object payload, UnityAction<T> 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<T>(request.downloadHandler.text);
onComplete?.Invoke(result);
return result;
}
catch (Exception ex)
{
Debug.LogError($"Exception during request: {ex.Message}");
throw;
}
finally
{
request.Dispose();
}
}
/// <summary>
/// 发送请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="type">请求类型</param>
/// <param name="payload">请求的负载数据</param>
/// <param name="onComplete">请求完成后的回调函数</param>
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();
}
}
/// <summary>
/// 创建UnityWebRequest请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="type">请求类型</param>
/// <param name="data">请求的负载数据</param>
/// <returns>UnityWebRequest实例</returns>
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;
}
/// <summary>
/// 请求类型
/// </summary>
public enum RequestType
{
GET = 0,
POST = 1
}
}