using System; using System.Collections.Generic; using System.Text; using Neatly.Module; using UnityEngine; using UnityEngine.Networking; public class HttpModule : ModuleSingleton { private enum HttpType { Text, Byte, } private struct WebStruct { public HttpType httpType; public readonly UnityWebRequest request; public readonly Action callBack; public readonly Action callBack1; public readonly Action errorAction; public float timeout; public WebStruct(UnityWebRequest request, Action callBack, Action errorAction = null) { this.httpType = HttpType.Text; this.request = request; this.callBack = callBack; this.callBack1 = null; this.errorAction = errorAction; this.timeout = float.MaxValue; } public WebStruct(UnityWebRequest request, Action callBack, Action errorAction = null, float timeout = float.MaxValue) { this.httpType = HttpType.Byte; this.request = request; this.callBack = null; this.callBack1 = callBack; this.errorAction = errorAction; this.timeout = timeout; } } private readonly List m_WebList = new List(); private static readonly DownloadHandlerBuffer m_DownloadHandlerBuffer = new DownloadHandlerBuffer(); public void Get(string url, string session, Action action, Action errorAction = null) { UnityWebRequest request = UnityWebRequest.Get(url); if (!string.IsNullOrEmpty(session)) { request.SetRequestHeader("Authorization", "Bearer " + session); } request.SendWebRequest(); m_WebList.Add(new WebStruct(request, action, errorAction)); } public void PostJson(string url, string session, string data, Action action, Action errorAction = null) { byte[] bodyRaw = Encoding.UTF8.GetBytes(data); UnityWebRequest request = new UnityWebRequest(url, "POST"); if (!string.IsNullOrEmpty(data)) { request.uploadHandler = new UploadHandlerRaw(bodyRaw); request.downloadHandler = new DownloadHandlerBuffer(); } request.SetRequestHeader("Content-Type", "application/json;charset=utf-8"); // if (!string.IsNullOrEmpty(session)) // { // request.SetRequestHeader("Authorization", "Bearer " + session); // } request.SendWebRequest(); m_WebList.Add(new WebStruct(request, action, errorAction)); } public void GetByte(string url, float timeout, string session, Action action, Action errorAction = null) { UnityWebRequest request = UnityWebRequest.Get(url); if (!string.IsNullOrEmpty(session)) { request.SetRequestHeader("Authorization", "Bearer " + session); } request.SendWebRequest(); m_WebList.Add(new WebStruct(request, action, errorAction, timeout)); } public void PostForm(string url, WWWForm form, Action action, Action errorAction = null) { var request = UnityWebRequest.Post(url, form); request.SendWebRequest(); m_WebList.Add(new WebStruct(request, action, errorAction)); } public override void Update(float dt) { for (int i = m_WebList.Count - 1; i >= 0; i--) { var webData = m_WebList[i]; UnityWebRequest request = webData.request; if (!request.isDone) { webData.timeout -= dt; m_WebList[i] = webData; if (webData.timeout < 0) { request.Abort(); Debug.Log("请求超时"); webData.errorAction?.Invoke(); m_WebList.RemoveAt(i); } continue; } if (request.isNetworkError || request.isHttpError) { Debug.LogError("http 请求错误:" + request.error); webData.errorAction?.Invoke(); } else { if (request.responseCode == 200) { if (webData.httpType == HttpType.Text) { webData.callBack?.Invoke(request.downloadHandler.text); } else { webData.callBack1?.Invoke(request.downloadHandler.data); } } else { Debug.LogError("当前请求状态:" + request.responseCode); webData.errorAction?.Invoke(); } } m_WebList.RemoveAt(i); } } }