Files
webRtc/Assets/Script/WebRequestSystem.cs

573 lines
22 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
2026-05-27 00:05:32 +08:00
using Script;
using UnityEngine;
using UnityEngine.Networking;
namespace Stary.Evo
{
public static class WebRequestSystem
{
private static string authorization;
2026-05-19 22:40:52 +08:00
private static byte[] certificateData;
static WebRequestSystem()
{
#if UNITY_EDITOR
authorization = CustomEditorPrefs.GetString("Authorization");
#else
authorization = CustomPlayerPrefs.GetString("Authorization");
#endif
2026-06-02 11:39:30 +08:00
}
private static async UniTask GetCertificateData()
{
2026-05-19 22:40:52 +08:00
var certPath = Path.Combine(Application.streamingAssetsPath, "server.crt");
2026-06-02 11:39:30 +08:00
if (certificateData == null)
{
#if UNITY_ANDROID && !UNITY_EDITOR
// Android平台使用UnityWebRequest读取
var webRequest = UnityWebRequest.Get(certPath);
await webRequest.SendWebRequest();
if (webRequest.result == UnityWebRequest.Result.Success)
{
certificateData = webRequest.downloadHandler.data;
}
#else
// 其他平台使用File读取
if (File.Exists(certPath))
{
certificateData = File.ReadAllBytes(certPath);
}
#endif
}
}
public static async Task<bool> Login(string url, string username, string password)
{
var data = new
{
username,
password,
roleType = "client"
};
var postData = JsonConvert.SerializeObject(data);
try
{
using var webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST);
webRequest.downloadHandler = new DownloadHandlerBuffer();
if (string.IsNullOrEmpty(postData))
{
Debug.LogError("WebRequestSystem.Login postData is null");
return false;
}
var postBytes = 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
{
var authResponse =
JsonConvert.DeserializeObject<ResultMessageEntity>(webRequest.downloadHandler.text);
Debug.Log("UnityEvo:ResultMessageEntity" + authResponse.data);
if (authResponse.code == 200)
{
var authResponseData =
JsonConvert.DeserializeObject<AuthenticationResponse>(authResponse.data.ToString());
Debug.Log("UnityEvo:AuthenticationResponse" + authResponseData.Token);
authorization = authResponseData.Token;
#if UNITY_EDITOR
CustomEditorPrefs.SetString("Authorization", authorization);
#else
CustomPlayerPrefs.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 = CustomEditorPrefs.GetString("Authorization");
#else
authorization = CustomPlayerPrefs.GetString("Authorization");
#endif
try
{
using var 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;
}
var 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,
Dictionary<string, string> headers = null, Action<float> uploadProgress = null)
{
//UnityWebRequest[] files = new UnityWebRequest[3];
var form = new WWWForm();
for (var i = 0; i < path.Length; i++)
{
var bytes = await File.ReadAllBytesAsync(path[i]);
form.AddBinaryData("files[]", bytes, Path.GetFileName(path[i]));
}
try
{
using var webRequest = UnityWebRequest.Post(url, form);
webRequest.SetRequestHeader("Authorization", authorization);
if (headers != null)
foreach (var header in headers)
webRequest.SetRequestHeader(header.Key, header.Value);
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
};
}
var 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)
{
try
{
2026-06-02 11:39:30 +08:00
await GetCertificateData();
using var webRequest = UnityWebRequest.Get(url);
webRequest.downloadHandler = new DownloadHandlerFile(tempPath);
2026-05-19 22:40:52 +08:00
webRequest.certificateHandler = new SelfSignedCertHandler(certificateData);
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
};
}
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<T> Get<T>(string url, string path)
{
try
{
2026-06-02 11:39:30 +08:00
await GetCertificateData();
var fullUrl = url.TrimEnd('/') + "/" + path.TrimStart('/');
using var webRequest = new UnityWebRequest(fullUrl, UnityWebRequest.kHttpVerbGET);
webRequest.downloadHandler = new DownloadHandlerBuffer();
2026-05-19 22:40:52 +08:00
webRequest.certificateHandler = new SelfSignedCertHandler(certificateData);
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);
}
var resultMessageEntity =
JsonConvert.DeserializeObject<T>(webRequest.downloadHandler.text);
return resultMessageEntity;
}
catch (Exception e)
{
Debug.LogError("UnityEvo:WebRequestSystem.Get" + e.Message);
}
return default;
}
/// <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)
{
try
{
using var 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();
var postBytes = 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 = 30;
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
};
}
var 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)
{
try
{
// 修复URL拼接
var fullUrl = url.TrimEnd('/') + "/" + path.TrimStart('/');
using var 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
};
}
// 修复空响应处理
var responseText = webRequest.downloadHandler.text;
if (string.IsNullOrEmpty(responseText))
return new ResultMessageEntity
{
code = 200,
message = "删除成功"
};
var 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)
{
try
{
// 修复URL拼接
using var webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPUT);
// 设置上传处理器
var putBytes = 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
};
}
// 处理空响应
var responseText = webRequest.downloadHandler.text;
if (string.IsNullOrEmpty(responseText))
return new ResultMessageEntity
{
code = 200,
message = "更新成功"
};
var 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
};
}
}
2026-05-27 00:05:32 +08:00
public static async UniTask Upload(string filePath, string serverBaseUrl, string meetingId, string userId,
MainPanel.UsersItem host,
List<MainPanel.UsersItem> participants)
{
2026-06-02 11:39:30 +08:00
await GetCertificateData();
2026-05-27 00:05:32 +08:00
var bytes = File.ReadAllBytes(filePath);
var fileName = Path.GetFileName(filePath);
var ext = Path.GetExtension(fileName).ToLowerInvariant();
var mimeType = ext == ".webm" ? "video/webm" : "video/mp4";
var form = new List<IMultipartFormSection>
{
new MultipartFormDataSection("meetingId", meetingId),
new MultipartFormDataSection("userId", userId),
new MultipartFormDataSection("filename", fileName),
new MultipartFormFileSection("recording", bytes, fileName, mimeType),
new MultipartFormDataSection("host", JsonConvert.SerializeObject(host)),
new MultipartFormDataSection("participants", JsonConvert.SerializeObject(participants))
};
using var request = UnityWebRequest.Post($"{serverBaseUrl}/api/recordings", form);
request.timeout = 300;
request.certificateHandler = new SelfSignedCertHandler(certificateData);
await request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
Debug.LogError($"上传失败: {request.error}, body={request.downloadHandler.text}");
else
Debug.Log($"上传成功: {request.downloadHandler.text}");
}
2026-06-02 11:39:30 +08:00
}
}