WebController.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using UnityEngine;
  7. using UnityEngine.Networking;
  8. using UnityEngine.SceneManagement;
  9. /* 本文件二次封装Web request
  10. * 不需要客户端确认是否需要提交accss_token,access_token白名单在EnviromentSetting里面
  11. * PostRequest 需要提交url, wwwForm, 上传附件path, 回调函数
  12. */
  13. public class WebController : MonoBehaviour
  14. {
  15. // Start is called before the first frame update
  16. //void Start()
  17. //{
  18. //}
  19. // Update is called once per frame
  20. //void Update()
  21. //{
  22. //}
  23. public static IEnumerator PostRequest(string url, WWWForm wwwForm, string filePath = null, System.Action<string> callback = null)
  24. {
  25. while (string.IsNullOrEmpty(EnviromentSetting.serverIP))
  26. {
  27. // 等待服务器IP被设置
  28. yield return new WaitForSeconds(0.1f);
  29. }
  30. // 检测是否需要添加access_token
  31. bool accessTokenReq = true;
  32. if (EnviromentSetting.accessTokenWhiteList.Contains<string>(url))
  33. {
  34. accessTokenReq = false;
  35. }
  36. // 添加access token
  37. if (accessTokenReq)
  38. {
  39. // 如果access token过期,跳转登录场景
  40. TimeSpan ts = DateTime.Now - EnviromentSetting.accessTokenReceivedTime;
  41. if (ts.TotalHours >= 24)
  42. {
  43. GameData.subScene = null;
  44. SceneManager.LoadScene("Login");
  45. }
  46. else
  47. {
  48. wwwForm.AddField("access_token", EnviromentSetting.accessToken);
  49. }
  50. }
  51. // 添加文件
  52. if (filePath != null)
  53. {
  54. byte[] fileData = System.IO.File.ReadAllBytes(filePath);
  55. wwwForm.AddBinaryData(Path.GetFileNameWithoutExtension(filePath), fileData);
  56. }
  57. wwwForm.AddField("date_time", DateTime.Now.ToString()); // 可选项,以服务器时间为准
  58. // 创建 UnityWebRequest 对象
  59. url = EnviromentSetting.serverIP + url;
  60. using (UnityWebRequest request = UnityWebRequest.Post(url, wwwForm))
  61. {
  62. // 发送请求并等待响应
  63. yield return request.SendWebRequest();
  64. // 检查是否有错误
  65. if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
  66. {
  67. Debug.Log("上传失败: " + request.error);
  68. if (request.error == "Cannot connect to destination host")
  69. {
  70. string msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "network_error", EnviromentSetting.languageCode });
  71. MessageBoxController.ShowMessage(msg, () => Application.Quit());
  72. }
  73. Debug.Log("上传失败信息: " + request.downloadHandler.text);
  74. }
  75. else
  76. {
  77. // 上传成功,获取服务器响应
  78. string responseText = request.downloadHandler.text;
  79. callback?.Invoke(responseText);
  80. Debug.Log("上传成功!服务器响应: " + responseText);
  81. }
  82. }
  83. }
  84. public static IEnumerator ServerAliveCheck()
  85. {
  86. string url = "/api/server/alive/";
  87. int serverIPIndex = 0;
  88. foreach (string serverIP in EnviromentSetting.serverIPs)
  89. {
  90. string fullUrl = serverIP + url;
  91. using (UnityWebRequest request = UnityWebRequest.Get(fullUrl))
  92. {
  93. yield return request.SendWebRequest();
  94. if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
  95. {
  96. Debug.Log("服务器不可用: " + fullUrl + ": " + request.error);
  97. serverIPIndex++;
  98. }
  99. else
  100. {
  101. Debug.Log("服务器可用: " + fullUrl);
  102. EnviromentSetting.serverIP = serverIP; // 更新当前使用的服务器IP
  103. yield break; // 如果有一个服务器可用,直接返回
  104. }
  105. }
  106. }
  107. if (serverIPIndex >= EnviromentSetting.serverIPs.Length)
  108. {
  109. string msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "network_error", EnviromentSetting.languageCode });
  110. MessageBoxController.ShowMessage(msg, () => Application.Quit());
  111. Application.Quit();
  112. Debug.LogError("所有服务器都不可用,退出游戏");
  113. }
  114. }
  115. }