157 lines
5.3 KiB
C#
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
|
|
}
|
|
}
|