UnityCommon/web/web.cs
2024-12-04 10:26:19 +08:00

110 lines
4.4 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.Collections;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Unity.VisualScripting.Antlr3.Runtime;
using UnityEngine;
using UnityEngine.Networking;
public class web : MonoBehaviour
{
public const string URL = "http://192.168.3.103:8089"; // 被注释掉的服务器地址(常量)
//public const string URL = "ws://124.221.149.22:38445/safety/cloud"; // 被注释掉的服务器地址(常量)
// 存储服务器返回的Cookie
private static Dictionary<string, string> cookieJar = new Dictionary<string, string>();
// 发送HTTP请求的方法支持GET和POST等不同的请求方式
public static async Task<string> SendRequest(string url, string method = "GET", string jsonData = "{}", Dictionary<string, string> head = null)
{
Debug.Log(url + "启动web"); // 调试输出,启动网络请求
// 使用UnityWebRequest类进行HTTP请求支持自定义请求方法
using (UnityWebRequest request = new UnityWebRequest(url, method))
{
// 设置下载处理器,用于处理服务器响应的数据
request.downloadHandler = new DownloadHandlerBuffer();
// 如果是POST请求设置请求体
if (method == "POST" && jsonData != null)
{
// 将JSON字符串转换为字节数组
byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData);
// 设置上传处理器,用于发送请求体数据
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
// 设置请求头指定请求体内容类型为JSON
request.SetRequestHeader("Content-Type", "application/json");
}
// 如果请求头部存在,添加请求头部信息
if (head != null)
foreach (string key in head.Keys)
{
// 遍历传入的头部字典,逐项设置请求头部
request.SetRequestHeader(key, head[key]);
}
// 设置已存储的 Cookie
if (cookieJar.Count > 0)
{
// 用于存储多个cookie值的字符串
string cookieHeader = "";
foreach (var cookie in cookieJar)
{
// 格式化每个cookie为“键=值”的形式,并附加到字符串中,以分号分隔
cookieHeader += $"{cookie.Key}={cookie.Value}; ";
}
// 设置请求头中的Cookie字段
request.SetRequestHeader("Cookie", cookieHeader);
}
// 发送请求并等待响应
var operation = request.SendWebRequest();
while (!operation.isDone)
await Task.Yield(); // 等待请求完成使用await以非阻塞的方式处理
// 检查是否存在网络错误或协议错误
if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
{
// 如果有错误输出错误信息并返回null
Debug.LogError($"Error: {request.error}" + url);
// 可以自定义弹窗提示用户错误信息,代码被注释掉了
// Promptmgr.Instance.PromptBubble(request.error, Color.black,Color.red);
return null;
}
else
{
// 处理返回的Cookie
string setCookieHeader;
string str = request.downloadHandler.text; // 获取服务器返回的文本内容
//Debug.Log(str); // 输出返回内容到控制台
// 尝试获取响应头中的“Set-Cookie”字段
if (request.GetResponseHeaders().TryGetValue("Set-Cookie", out setCookieHeader))
{
// 将“Set-Cookie”字段的内容按分号分隔为多个部分
string[] cookies = setCookieHeader.Split(';');
foreach (var cookie in cookies)
{
// 将每个cookie分为“键=值”的形式
var cookieParts = cookie.Split('=');
if (cookieParts.Length == 2)
{
string key = cookieParts[0].Trim(); // 去掉键的空格
string value = cookieParts[1].Trim(); // 去掉值的空格
// 存储到cookieJar中以备后续请求使用
cookieJar[key] = value;
}
}
}
// 返回响应内容(文本形式)
return request.downloadHandler.text;
}
}
}
}