Files
plugin-library/Assets/00.StaryEvo/Runtime/Tool/WebRequest/WebRequestSystem.cs
2025-10-20 15:15:38 +08:00

611 lines
23 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using UnityEditor;
using UnityEngine;
using UnityEngine.Networking;
namespace Stary.Evo
{
public static class WebRequestSystem
{
private static string authorization;
static WebRequestSystem()
{
#if UNITY_EDITOR
authorization = EditorPrefs.GetString("Authorization");
#else
authorization = PlayerPrefs.GetString("Authorization");
#endif
}
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);
try
{
using UnityWebRequest webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST);
webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
if (string.IsNullOrEmpty(postData))
{
Debug.LogError("WebRequestSystem.Login postData is null");
return false;
}
byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postData);
webRequest.uploadHandler = new UploadHandlerRaw(postBytes);
webRequest.SetRequestHeader("Content-Type", "application/json");
webRequest.timeout = 10;
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);
Debug.Log("UnityEvo:ResultMessageEntity" + authResponse.data);
if (authResponse.code == 200)
{
AuthenticationResponse authResponseData =
JsonConvert.DeserializeObject<AuthenticationResponse>(authResponse.data.ToString());
Debug.Log("UnityEvo:AuthenticationResponse" + authResponseData.Token);
authorization = authResponseData.Token;
#if UNITY_EDITOR
EditorPrefs.SetString("Authorization", authorization);
#else
PlayerPrefs.SetString("Authorization",authorization);
#endif
Debug.Log("UnityEvo:登录成功");
return true;
}
}
return false;
}
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.Login" + e.Message);
return false;
}
}
/// <summary>
/// GET请求数据
/// </summary>
/// <param name="url">请求数据的URL地址</param>
/// <param name="token">token验证的参数此处为authorization</param>
/// <returns></returns>
public static async Task<bool> GetValidateToken(string url)
{
#if UNITY_EDITOR
authorization = EditorPrefs.GetString("Authorization");
#else
authorization = PlayerPrefs.GetString("Authorization");
#endif
try
{
using UnityWebRequest webRequest =
new UnityWebRequest($"{url}?token={authorization}", UnityWebRequest.kHttpVerbGET);
//using UnityWebRequest webRequest = UnityWebRequest.Get($"{url}?token={authorization}");
webRequest.downloadHandler = new DownloadHandlerBuffer();
webRequest.timeout = 10;
await webRequest.SendWebRequest();
// 增强错误处理
if (webRequest.result != UnityWebRequest.Result.Success)
{
var errorMsg = $"HTTP {webRequest.responseCode}\n" +
$"URL: {url}\n" +
$"Error: {webRequest.error}\n" +
$"Response: {webRequest.downloadHandler.text}";
Debug.LogError(errorMsg);
return false;
}
ResultMessageEntity resultMessageEntity =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
if (resultMessageEntity.code == 200)
return true; // 添加返回值
return false;
}
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.GetValidateToken" + e.Message);
return false;
}
}
/// <summary>
/// POST请求数据
/// </summary>
/// <param name="url">获取Token值的服务URL地址很重要</param>
/// <param name="postData">传入请求的参数此处参数为JOSN格式</param>
/// <returns></returns>
public static async Task<ResultMessageEntity> PostFile(string url, string[] path,Action<float> uploadProgress = null)
{
if (!GetTokenState())
{
Debug.LogError("用户未登录,请先登录");
return new ResultMessageEntity()
{
code = 2001,
message = "用户未登录,请先登录"
};
}
//UnityWebRequest[] files = new UnityWebRequest[3];
WWWForm form = new WWWForm();
for (int i = 0; i < path.Length; i++)
{
byte[] bytes = await File.ReadAllBytesAsync(path[i]);
form.AddBinaryData("files[]", bytes, Path.GetFileName(path[i]));
}
try
{
using UnityWebRequest webRequest = UnityWebRequest.Post(url, form);
webRequest.SetRequestHeader("Authorization", authorization);
webRequest.disposeUploadHandlerOnDispose = true;
webRequest.disposeDownloadHandlerOnDispose = true;
webRequest.disposeCertificateHandlerOnDispose = true;
webRequest.timeout = 60;
// 发送请求但不等待完成
var operation = webRequest.SendWebRequest();
// 轮询获取上传进度
while (!operation.isDone)
{
// 调用进度回调函数
uploadProgress?.Invoke(webRequest.uploadProgress);
// 等待一帧,避免阻塞
await UniTask.Yield();
}
webRequest.uploadHandler?.Dispose();
// 更新错误检查方式
if (webRequest.result == UnityWebRequest.Result.ConnectionError ||
webRequest.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError(webRequest.error);
return new ResultMessageEntity()
{
code = 5001,
message = webRequest.error
};
}
else
{
ResultMessageEntity resultMessageEntity =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
if (resultMessageEntity.code != 200)
{
Debug.LogError("上传异常,无文件数据返回!!");
}
return resultMessageEntity;
}
}
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.PostFile" + e.Message);
return new ResultMessageEntity()
{
code = 5001,
message = e.Message
};
}
}
/// <summary>
/// GET请求数据
/// </summary>
/// <param name="url">请求数据的URL地址</param>
/// <param name="token">token验证的参数此处为authorization</param>
/// <returns></returns>
public static async Task<ResultMessageEntity> GetFile(string url, string tempPath,
Action<float> downloadProgress = null)
{
if (!GetTokenState())
{
Debug.LogError("用户未登录,请先登录");
return new ResultMessageEntity()
{
code = 2001,
message = "用户未登录,请先登录"
};
}
try
{
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)
{
downloadProgress?.Invoke(webRequest.downloadProgress);
await UniTask.Yield();
}
// 增强错误处理
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()
{
code = 5001,
message = errorMsg
};
}
else
{
return new ResultMessageEntity()
{
code = 200,
message = "下载成功"
};
}
}
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.GetFile" + e.Message);
return new ResultMessageEntity()
{
code = 5001,
message = e.Message
};
}
}
/// <summary>
/// GET请求数据
/// 携带数据:否
/// 幂等性:是
/// </summary>
/// <param name="url">请求数据的URL地址</param>
/// <param name="path">请求数据的路径</param>
/// <returns></returns>
public static async Task<ResultMessageEntity> Get(string url, string path)
{
if (!GetTokenState())
{
Debug.LogError("用户未登录,请先登录");
return new ResultMessageEntity()
{
code = 2001,
message = "用户未登录,请先登录"
};
}
try
{
string fullUrl = url.TrimEnd('/') + "/" + path.TrimStart('/');
using UnityWebRequest webRequest = new UnityWebRequest(fullUrl, UnityWebRequest.kHttpVerbGET);
webRequest.downloadHandler = new DownloadHandlerBuffer();
if (authorization != null)
webRequest.SetRequestHeader("Authorization", authorization); // 修正请求头名称规范
webRequest.timeout = 20;
await webRequest.SendWebRequest();
// 增强错误处理
if (webRequest.result != UnityWebRequest.Result.Success)
{
var errorMsg = $"HTTP {webRequest.responseCode}\n" +
$"URL: {url}\n" +
$"Error: {webRequest.error}\n" +
$"Response: {webRequest.downloadHandler.text}";
Debug.LogError(errorMsg);
return new ResultMessageEntity()
{
code = 5001,
message = errorMsg
};
}
ResultMessageEntity resultMessageEntity =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
if (resultMessageEntity.code != 200)
{
Debug.LogError(resultMessageEntity.message);
}
return resultMessageEntity;
}
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.Get" + e.Message);
return new ResultMessageEntity()
{
code = 5001,
message = e.Message
};
}
}
/// <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())
{
Debug.LogError("用户未登录,请先登录");
return new ResultMessageEntity()
{
code = 2001,
message = "用户未登录,请先登录"
};
}
try
{
using UnityWebRequest webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST);
// #if UNITY_2021_3_OR_NEWER
// using (UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData)) //第二种写法此行注释
// #else
// using (UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData)) //第二种写法此行注释
// #endif
webRequest.downloadHandler = new DownloadHandlerBuffer();
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)
{
Debug.LogError(webRequest.error);
return new ResultMessageEntity()
{
code = 5001,
message = webRequest.error
};
}
else
{
ResultMessageEntity resultMessageEntity =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
if (resultMessageEntity.code != 200)
{
Debug.LogError(resultMessageEntity.message);
}
return resultMessageEntity;
}
}
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.Post" + e.Message);
return new ResultMessageEntity()
{
code = 5001,
message = e.Message
};
}
}
/// <summary>
/// Delete请求数据
/// 携带数据:否
/// 幂等性:是
/// </summary>
/// <param name="url">请求数据的URL地址</param>
/// <param name="path">请求数据的路径</param>
/// <returns></returns>
public static async Task<ResultMessageEntity> Delete(string url, string path)
{
if (!GetTokenState())
{
Debug.LogError("用户未登录,请先登录");
return new ResultMessageEntity()
{
code = 2001,
message = "用户未登录,请先登录"
};
}
try
{
// 修复URL拼接
string fullUrl = url.TrimEnd('/') + "/" + path.TrimStart('/');
using UnityWebRequest webRequest = new UnityWebRequest(fullUrl, UnityWebRequest.kHttpVerbDELETE);
webRequest.downloadHandler = new DownloadHandlerBuffer();
if (authorization != null)
webRequest.SetRequestHeader("Authorization", authorization); // 修正请求头名称规范
webRequest.timeout = 20;
await webRequest.SendWebRequest();
// 增强错误处理
if (webRequest.result != UnityWebRequest.Result.Success)
{
var errorMsg = $"HTTP {webRequest.responseCode}\n" +
$"URL: {url}\n" +
$"Error: {webRequest.error}\n" +
$"Response: {webRequest.downloadHandler.text}";
Debug.LogError(errorMsg);
return new ResultMessageEntity()
{
code = 5001,
message = errorMsg
};
}
// 修复空响应处理
string responseText = webRequest.downloadHandler.text;
if (string.IsNullOrEmpty(responseText))
{
return new ResultMessageEntity()
{
code = 200,
message = "删除成功"
};
}
ResultMessageEntity resultMessageEntity =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
if (resultMessageEntity.code != 200)
{
Debug.LogError(resultMessageEntity.message);
}
return resultMessageEntity;
}
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.Get" + e.Message);
return new ResultMessageEntity()
{
code = 5001,
message = e.Message
};
}
}
/// <summary>
/// PUT请求数据
/// 携带数据:是
/// 幂等性:是
/// </summary>
/// <param name="url">请求数据的URL地址</param>
/// <param name="path">请求数据的路径</param>
/// <param name="putData">要更新的数据JSON格式</param>
/// <returns></returns>
public static async Task<ResultMessageEntity> Put(string url, string putData)
{
if (!GetTokenState())
{
Debug.LogError("用户未登录,请先登录");
return new ResultMessageEntity()
{
code = 2001,
message = "用户未登录,请先登录"
};
}
try
{
// 修复URL拼接
using UnityWebRequest webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPUT);
// 设置上传处理器
byte[] putBytes = System.Text.Encoding.UTF8.GetBytes(putData);
webRequest.uploadHandler = new UploadHandlerRaw(putBytes);
webRequest.downloadHandler = new DownloadHandlerBuffer();
// 设置请求头
webRequest.SetRequestHeader("Content-Type", "application/json");
if (authorization != null)
webRequest.SetRequestHeader("Authorization", authorization); // 修正请求头名称规范
webRequest.timeout = 20;
await webRequest.SendWebRequest();
// 增强错误处理
if (webRequest.result != UnityWebRequest.Result.Success)
{
var errorMsg = $"HTTP {webRequest.responseCode}\n" +
$"URL: {url}\n" +
$"Error: {webRequest.error}\n" +
$"Response: {webRequest.downloadHandler.text}";
Debug.LogError(errorMsg);
return new ResultMessageEntity()
{
code = 5001,
message = errorMsg
};
}
// 处理空响应
string responseText = webRequest.downloadHandler.text;
if (string.IsNullOrEmpty(responseText))
{
return new ResultMessageEntity()
{
code = 200,
message = "更新成功"
};
}
ResultMessageEntity resultMessageEntity =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
if (resultMessageEntity.code != 200)
{
Debug.LogError(resultMessageEntity.message);
}
return resultMessageEntity;
}
catch (Exception e)
{
Debug.LogError($"UnityEvo:WebRequestSystem.Put" + e.Message);
return new ResultMessageEntity()
{
code = 5001,
message = e.Message
};
}
}
public static bool GetTokenState()
{
if (string.IsNullOrEmpty(authorization))
{
return false;
}
return true;
}
}
}