Files
plugin-library/Assets/00.StaryEvo/Runtime/Tool/WebRequest/WebRequestSystem.cs
2025-09-04 11:43:35 +08:00

400 lines
15 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 UnityEngine;
using UnityEngine.Networking;
namespace Stary.Evo
{
public static class WebRequestSystem
{
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);
try
{
#if UNITY_2021_3_OR_NEWER
using UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData);
#else
using UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData);
#endif
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;
PlayerPrefs.SetString("Authorization", authorization);
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)
{
authorization = PlayerPrefs.GetString("Authorization");
try
{
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)
{
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;
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("上传异常,无文件数据返回!!");
}
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>
/// 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
{
#if UNITY_2021_3_OR_NEWER
using (UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData)) //第二种写法此行注释
#else
using (UnityWebRequest webRequest = UnityWebRequest.PostWwwForm(url, postData)) //第二种写法此行注释
#endif
{
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>
/// 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
{
using UnityWebRequest webRequest = UnityWebRequest.Get(url);
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
};
}
}
public static bool GetTokenState()
{
if (string.IsNullOrEmpty(authorization))
{
return false;
}
return true;
}
}
}