Files
plugin-library/Assets/00.StaryEvo/Runtime/Tool/WebRequest/WebRequestSystem.cs

400 lines
15 KiB
C#
Raw Normal View History

2025-03-31 11:16:52 +08:00
using System;
using System.Collections.Generic;
2025-05-30 14:50:46 +08:00
using System.IO;
2025-03-31 14:55:24 +08:00
using System.Threading.Tasks;
2025-04-11 09:56:06 +08:00
using Cysharp.Threading.Tasks;
2025-05-30 14:50:46 +08:00
using Newtonsoft.Json;
2025-03-31 11:16:52 +08:00
using UnityEngine;
using UnityEngine.Networking;
namespace Stary.Evo
{
2025-05-30 14:50:46 +08:00
public static class WebRequestSystem
2025-03-31 11:16:52 +08:00
{
2025-05-30 14:50:46 +08:00
private static string authorization;
public static async Task<bool> Login(string url, string username, string password)
{
var data = new
{
username = username,
password = password,
roleType = "client",
};
string postData = JsonConvert.SerializeObject(data);
2025-06-12 14:20:37 +08:00
try
2025-05-30 14:50:46 +08:00
{
2025-08-13 17:48:10 +08:00
#if UNITY_2021_3_OR_NEWER
2025-08-21 16:42:16 +08:00
using UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData);
2025-08-13 17:48:10 +08:00
#else
using UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData);
#endif
2025-08-13 17:54:09 +08:00
2025-05-30 14:50:46 +08:00
byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postData);
webRequest.uploadHandler = new UploadHandlerRaw(postBytes);
webRequest.SetRequestHeader("Content-Type", "application/json");
2025-06-12 14:20:37 +08:00
webRequest.timeout = 10;
2025-05-30 14:50:46 +08:00
await webRequest.SendWebRequest();
webRequest.uploadHandler?.Dispose();
// 更新错误检查方式
if (webRequest.result == UnityWebRequest.Result.ConnectionError ||
webRequest.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError(webRequest.error);
}
else
{
ResultMessageEntity authResponse =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
2025-06-12 14:20:37 +08:00
Debug.Log("UnityEvo:ResultMessageEntity" + authResponse.data);
2025-05-30 14:50:46 +08:00
if (authResponse.code == 200)
{
AuthenticationResponse authResponseData =
JsonConvert.DeserializeObject<AuthenticationResponse>(authResponse.data.ToString());
2025-06-12 14:20:37 +08:00
Debug.Log("UnityEvo:AuthenticationResponse" + authResponseData.Token);
2025-05-30 14:50:46 +08:00
authorization = authResponseData.Token;
PlayerPrefs.SetString("Authorization", authorization);
2025-06-12 14:20:37 +08:00
Debug.Log("UnityEvo:登录成功");
2025-05-30 14:50:46 +08:00
return true;
}
}
return false;
}
2025-06-12 14:20:37 +08:00
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.Login" + e.Message);
return false;
}
2025-05-30 14:50:46 +08:00
}
/// <summary>
/// GET请求数据
/// </summary>
/// <param name="url">请求数据的URL地址</param>
/// <param name="token">token验证的参数此处为authorization</param>
/// <returns></returns>
public static async Task<bool> GetValidateToken(string url)
{
authorization = PlayerPrefs.GetString("Authorization");
try
{
2025-06-12 14:20:37 +08:00
using UnityWebRequest webRequest = UnityWebRequest.Get($"{url}?token={authorization}");
webRequest.downloadHandler = new DownloadHandlerBuffer();
webRequest.timeout = 10;
await webRequest.SendWebRequest();
// 增强错误处理
if (webRequest.result != UnityWebRequest.Result.Success)
2025-05-30 14:50:46 +08:00
{
2025-06-12 14:20:37 +08:00
var errorMsg = $"HTTP {webRequest.responseCode}\n" +
$"URL: {url}\n" +
$"Error: {webRequest.error}\n" +
$"Response: {webRequest.downloadHandler.text}";
2025-05-30 14:50:46 +08:00
2025-06-12 14:20:37 +08:00
Debug.LogError(errorMsg);
return false;
}
2025-05-30 14:50:46 +08:00
2025-06-12 14:20:37 +08:00
ResultMessageEntity resultMessageEntity =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
if (resultMessageEntity.code == 200)
return true; // 添加返回值
2025-05-30 14:50:46 +08:00
2025-06-12 14:20:37 +08:00
return false;
2025-05-30 14:50:46 +08:00
}
catch (Exception e)
{
2025-06-12 14:20:37 +08:00
Debug.LogError($"UnityEvo:WebRequestSystem.GetValidateToken" + e.Message);
return false;
2025-05-30 14:50:46 +08:00
}
}
2025-03-31 11:16:52 +08:00
/// <summary>
/// POST请求数据
/// </summary>
/// <param name="url">获取Token值的服务URL地址很重要</param>
/// <param name="postData">传入请求的参数此处参数为JOSN格式</param>
/// <returns></returns>
2025-05-30 14:50:46 +08:00
public static async Task<ResultMessageEntity> PostFile(string url, string[] path)
2025-03-31 11:16:52 +08:00
{
2025-05-30 14:50:46 +08:00
if (!GetTokenState())
2025-03-31 11:16:52 +08:00
{
2025-05-30 14:50:46 +08:00
Debug.LogError("用户未登录,请先登录");
return new ResultMessageEntity()
{
code = 2001,
message = "用户未登录,请先登录"
};
}
2025-06-12 14:20:37 +08:00
2025-05-30 14:50:46 +08:00
//UnityWebRequest[] files = new UnityWebRequest[3];
WWWForm form = new WWWForm();
2025-03-31 11:16:52 +08:00
2025-05-30 14:50:46 +08:00
for (int i = 0; i < path.Length; i++)
{
byte[] bytes = await File.ReadAllBytesAsync(path[i]);
form.AddBinaryData("files[]", bytes, Path.GetFileName(path[i]));
}
2025-06-12 14:20:37 +08:00
try
2025-05-30 14:50:46 +08:00
{
2025-06-12 14:20:37 +08:00
using UnityWebRequest webRequest = UnityWebRequest.Post(url, form);
2025-05-30 14:50:46 +08:00
webRequest.SetRequestHeader("Authorization", authorization);
webRequest.disposeUploadHandlerOnDispose = true;
webRequest.disposeDownloadHandlerOnDispose = true;
webRequest.disposeCertificateHandlerOnDispose = true;
2025-06-12 14:20:37 +08:00
webRequest.timeout = 60;
2025-03-31 11:16:52 +08:00
await webRequest.SendWebRequest();
2025-05-30 14:50:46 +08:00
webRequest.uploadHandler?.Dispose();
2025-03-31 11:16:52 +08:00
// 更新错误检查方式
if (webRequest.result == UnityWebRequest.Result.ConnectionError ||
webRequest.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError(webRequest.error);
2025-05-30 14:50:46 +08:00
return new ResultMessageEntity()
{
code = 5001,
message = webRequest.error
};
2025-03-31 11:16:52 +08:00
}
else
{
2025-05-30 14:50:46 +08:00
ResultMessageEntity resultMessageEntity =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
if (resultMessageEntity.code != 200)
{
Debug.LogError("上传异常,无文件数据返回!!");
}
2025-06-12 14:20:37 +08:00
2025-05-30 14:50:46 +08:00
return resultMessageEntity;
2025-03-31 11:16:52 +08:00
}
}
2025-06-12 14:20:37 +08:00
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.PostFile" + e.Message);
return new ResultMessageEntity()
{
code = 5001,
message = e.Message
};
}
2025-03-31 11:16:52 +08:00
}
2025-06-12 14:20:37 +08:00
/// <summary>
2025-03-31 11:16:52 +08:00
/// GET请求数据
/// </summary>
/// <param name="url">请求数据的URL地址</param>
/// <param name="token">token验证的参数此处为authorization</param>
/// <returns></returns>
2025-06-12 14:20:37 +08:00
public static async Task<ResultMessageEntity> GetFile(string url, string tempPath,
Action<float> downloadProgress = null)
2025-03-31 11:16:52 +08:00
{
2025-05-30 14:50:46 +08:00
if (!GetTokenState())
{
Debug.LogError("用户未登录,请先登录");
return new ResultMessageEntity()
{
code = 2001,
message = "用户未登录,请先登录"
};
}
2025-03-31 11:16:52 +08:00
try
{
2025-06-12 14:20:37 +08:00
using UnityWebRequest webRequest = UnityWebRequest.Get(url);
webRequest.downloadHandler = new DownloadHandlerFile(tempPath);
if (authorization != null)
webRequest.SetRequestHeader("Authorization", authorization); // 修正请求头名称规范
var operation = webRequest.SendWebRequest();
while (!operation.isDone)
2025-05-30 14:50:46 +08:00
{
2025-06-12 14:20:37 +08:00
downloadProgress?.Invoke(webRequest.downloadProgress);
await UniTask.Yield();
}
2025-05-30 14:50:46 +08:00
2025-06-12 14:20:37 +08:00
// 增强错误处理
if (webRequest.result != UnityWebRequest.Result.Success)
{
var errorMsg = $"HTTP {webRequest.responseCode}\n" +
$"URL: {url}\n" +
$"Error: {webRequest.error}\n";
Debug.LogError(errorMsg);
return new ResultMessageEntity()
2025-05-30 14:50:46 +08:00
{
2025-06-12 14:20:37 +08:00
code = 5001,
message = errorMsg
};
}
else
{
return new ResultMessageEntity()
{
code = 200,
message = "下载成功"
};
2025-05-30 14:50:46 +08:00
}
}
catch (Exception e)
{
2025-06-12 14:20:37 +08:00
Debug.LogError($"UnityEvo:WebRequestSystem.GetFile" + e.Message);
2025-05-30 14:50:46 +08:00
return new ResultMessageEntity()
{
code = 5001,
message = e.Message
};
}
}
2025-06-12 14:20:37 +08:00
2025-05-30 14:50:46 +08:00
/// <summary>
/// POST请求数据
/// </summary>
/// <param name="url">获取Token值的服务URL地址很重要</param>
/// <param name="postData">传入请求的参数此处参数为JOSN格式</param>
/// <returns></returns>
public static async Task<ResultMessageEntity> Post(string url, string postData)
{
if (!GetTokenState())
2025-03-31 11:16:52 +08:00
{
2025-05-30 14:50:46 +08:00
Debug.LogError("用户未登录,请先登录");
return new ResultMessageEntity()
{
code = 2001,
message = "用户未登录,请先登录"
};
}
2025-03-31 11:16:52 +08:00
2025-06-12 14:20:37 +08:00
try
2025-05-30 14:50:46 +08:00
{
2025-08-13 17:54:09 +08:00
#if UNITY_2021_3_OR_NEWER
2025-08-21 16:42:16 +08:00
using (UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData)) //第二种写法此行注释
2025-08-13 17:54:09 +08:00
#else
using (UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData)) //第二种写法此行注释
#endif
2025-03-31 11:16:52 +08:00
{
2025-06-12 14:20:37 +08:00
byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postData);
webRequest.uploadHandler = new UploadHandlerRaw(postBytes);
webRequest.SetRequestHeader("Content-Type", "application/json");
webRequest.SetRequestHeader("Authorization", authorization);
webRequest.disposeUploadHandlerOnDispose = true;
webRequest.disposeDownloadHandlerOnDispose = true;
webRequest.disposeCertificateHandlerOnDispose = true;
webRequest.timeout = 20;
await webRequest.SendWebRequest();
webRequest.uploadHandler?.Dispose();
// 更新错误检查方式
if (webRequest.result == UnityWebRequest.Result.ConnectionError ||
webRequest.result == UnityWebRequest.Result.ProtocolError)
2025-05-30 14:50:46 +08:00
{
2025-06-12 14:20:37 +08:00
Debug.LogError(webRequest.error);
return new ResultMessageEntity()
{
code = 5001,
message = webRequest.error
};
}
else
2025-05-30 14:50:46 +08:00
{
2025-06-12 14:20:37 +08:00
ResultMessageEntity resultMessageEntity =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
if (resultMessageEntity.code != 200)
{
Debug.LogError(resultMessageEntity.message);
}
return resultMessageEntity;
2025-05-30 14:50:46 +08:00
}
2025-03-31 11:16:52 +08:00
}
}
2025-06-12 14:20:37 +08:00
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.Post" + e.Message);
return new ResultMessageEntity()
{
code = 5001,
message = e.Message
};
}
2025-05-30 14:50:46 +08:00
}
/// <summary>
/// GET请求数据
/// </summary>
/// <param name="url">请求数据的URL地址</param>
/// <param name="token">token验证的参数此处为authorization</param>
/// <returns></returns>
public static async Task<ResultMessageEntity> Get(string url)
{
if (!GetTokenState())
{
Debug.LogError("用户未登录,请先登录");
return new ResultMessageEntity()
{
code = 2001,
message = "用户未登录,请先登录"
};
}
try
{
2025-06-12 14:20:37 +08:00
using UnityWebRequest webRequest = UnityWebRequest.Get(url);
webRequest.downloadHandler = new DownloadHandlerBuffer();
if (authorization != null)
webRequest.SetRequestHeader("Authorization", authorization); // 修正请求头名称规范
2025-05-30 14:50:46 +08:00
2025-06-12 14:20:37 +08:00
webRequest.timeout = 20;
await webRequest.SendWebRequest();
2025-05-30 14:50:46 +08:00
2025-06-12 14:20:37 +08:00
// 增强错误处理
if (webRequest.result != UnityWebRequest.Result.Success)
{
var errorMsg = $"HTTP {webRequest.responseCode}\n" +
$"URL: {url}\n" +
$"Error: {webRequest.error}\n" +
$"Response: {webRequest.downloadHandler.text}";
2025-05-30 14:50:46 +08:00
2025-06-12 14:20:37 +08:00
Debug.LogError(errorMsg);
return new ResultMessageEntity()
2025-05-30 14:50:46 +08:00
{
2025-06-12 14:20:37 +08:00
code = 5001,
message = errorMsg
};
2025-05-30 14:50:46 +08:00
}
2025-06-12 14:20:37 +08:00
ResultMessageEntity resultMessageEntity =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
if (resultMessageEntity.code != 200)
{
Debug.LogError(resultMessageEntity.message);
}
return resultMessageEntity;
2025-03-31 11:16:52 +08:00
}
catch (Exception e)
{
2025-06-12 14:20:37 +08:00
Debug.LogError($"UnityEvo:WebRequestSystem.Get" + e.Message);
2025-05-30 14:50:46 +08:00
return new ResultMessageEntity()
{
code = 5001,
message = e.Message
};
2025-03-31 11:16:52 +08:00
}
2025-05-30 14:50:46 +08:00
}
public static bool GetTokenState()
{
if (string.IsNullOrEmpty(authorization))
{
return false;
}
return true;
2025-03-31 11:16:52 +08:00
}
}
}