using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEngine; using UnityEngine.Networking; using UnityEngine.SceneManagement; /* 本文件二次封装Web request * 不需要客户端确认是否需要提交accss_token,access_token白名单在EnviromentSetting里面 * PostRequest 需要提交url, wwwForm, 上传附件path, 回调函数 */ public class WebController : MonoBehaviour { // Start is called before the first frame update //void Start() //{ //} // Update is called once per frame //void Update() //{ //} public static IEnumerator PostRequest(string url, WWWForm wwwForm, string filePath = null, System.Action callback = null) { while (string.IsNullOrEmpty(EnviromentSetting.serverIP)) { // 等待服务器IP被设置 yield return new WaitForSeconds(0.1f); } // 检测是否需要添加access_token bool accessTokenReq = true; if (EnviromentSetting.accessTokenWhiteList.Contains(url)) { accessTokenReq = false; } // 添加access token if (accessTokenReq) { // 如果access token过期,跳转登录场景 TimeSpan ts = DateTime.Now - EnviromentSetting.accessTokenReceivedTime; if (ts.TotalHours >= 24) { GameData.subScene = null; SceneManager.LoadScene("Login"); } else { wwwForm.AddField("access_token", EnviromentSetting.accessToken); } } // 添加文件 if (filePath != null) { byte[] fileData = System.IO.File.ReadAllBytes(filePath); wwwForm.AddBinaryData(Path.GetFileNameWithoutExtension(filePath), fileData); } wwwForm.AddField("date_time", DateTime.Now.ToString()); // 可选项,以服务器时间为准 // 创建 UnityWebRequest 对象 url = EnviromentSetting.serverIP + url; using (UnityWebRequest request = UnityWebRequest.Post(url, wwwForm)) { // 发送请求并等待响应 yield return request.SendWebRequest(); // 检查是否有错误 if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) { Debug.Log("上传失败: " + request.error); if (request.error == "Cannot connect to destination host") { string msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "network_error", EnviromentSetting.languageCode }); MessageBoxController.ShowMessage(msg, () => Application.Quit()); } Debug.Log("上传失败信息: " + request.downloadHandler.text); } else { // 上传成功,获取服务器响应 string responseText = request.downloadHandler.text; callback?.Invoke(responseText); Debug.Log("上传成功!服务器响应: " + responseText); } } } public static IEnumerator ServerAliveCheck() { string url = "/api/server/alive/"; int serverIPIndex = 0; foreach (string serverIP in EnviromentSetting.serverIPs) { string fullUrl = serverIP + url; using (UnityWebRequest request = UnityWebRequest.Get(fullUrl)) { yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) { Debug.Log("服务器不可用: " + fullUrl + ": " + request.error); serverIPIndex++; } else { Debug.Log("服务器可用: " + fullUrl); EnviromentSetting.serverIP = serverIP; // 更新当前使用的服务器IP yield break; // 如果有一个服务器可用,直接返回 } } } if (serverIPIndex >= EnviromentSetting.serverIPs.Length) { string msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "network_error", EnviromentSetting.languageCode }); MessageBoxController.ShowMessage(msg, () => Application.Quit()); Application.Quit(); Debug.LogError("所有服务器都不可用,退出游戏"); } } }