unity之通用Http請求(Get\Post)
阿新 • • 發佈:2022-05-21
邏輯結構圖:
TestHttpCallBackArgs http回撥引數
1 using System; 2 3 /// <summary> 4 /// http回撥引數 5 /// </summary> 6 public class TestHttpCallBackArgs : EventArgs 7 { 8 /// <summary> 9 /// 是否有錯 10 /// </summary> 11 public bool HasError; 12 /// <summary> 13 /// 錯誤值 14 ///</summary> 15 public string ErrorValue; 16 /// <summary> 17 /// 值 18 /// </summary> 19 public string Value; 20 /// <summary> 21 /// 資料 22 /// </summary> 23 public byte[] Data; 24 25 public void Init() 26 { 27 HasError = false; 28 ErrorValue = string.Empty; 29 Value = string.Empty; 30 Data = null; 31 } 32 }
TestHttpRoutine http訪問器
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.Networking; 5 6 public delegate void HttpSendDataCallBack(TestHttpCallBackArgs callBackArgs);7 8 /// <summary> 9 /// http訪問器 10 /// </summary> 11 public class TestHttpRoutine 12 { 13 private HttpSendDataCallBack m_SendCallBack; 14 private readonly TestHttpCallBackArgs m_CallBackArgs; 15 private bool m_IsBusy; 16 /// <summary> 17 /// 是否獲取Data資料 18 /// </summary> 19 private bool m_IsGetData; 20 21 public TestHttpRoutine() 22 { 23 m_CallBackArgs = TestGameEntry.PoolMgr.Class_Dequeue<TestHttpCallBackArgs>(); 24 m_CallBackArgs.Init(); 25 } 26 27 /// <summary> 28 /// 傳送資料 29 /// </summary> 30 /// <param name="url"></param> 31 /// <param name="sendCallBack"></param> 32 /// <param name="isPost"></param> 33 /// <param name="isGetData"></param> 34 /// <param name="data"></param> 35 public void SendData(string url, HttpSendDataCallBack sendCallBack, bool isPost = false, bool isGetData = false, Dictionary<object, object> data = null) 36 { 37 if (m_IsBusy) return; 38 m_IsBusy = true; 39 m_IsGetData = isGetData; 40 m_SendCallBack = sendCallBack; 41 string json = string.Empty; 42 if (isPost) 43 { 44 json = LitJson.JsonMapper.ToJson(data); 45 PostUrl(url, json); 46 } 47 else 48 { 49 GetUrl(url); 50 } 51 if (!m_IsGetData) 52 { 53 Debug.Log("<color=#ffa200>傳送訊息:</color><color=#FFFB80>" + url + "</color>"); 54 if (json != string.Empty) 55 { 56 Debug.Log("<color=#ffdeb3>==>>" + json + "</color>"); 57 } 58 } 59 } 60 61 /// <summary> 62 /// Get請求 63 /// </summary> 64 /// <param name="url"></param> 65 private void GetUrl(string url) 66 { 67 UnityWebRequest webRequest = UnityWebRequest.Get(url); 68 TestGameEntry.Instance.StartCoroutine(Request(webRequest)); 69 } 70 71 /// <summary> 72 /// post請求 73 /// </summary> 74 /// <param name="url"></param> 75 /// <param name="json"></param> 76 private void PostUrl(string url, string json) 77 { 78 WWWForm form = new WWWForm(); 79 form.AddField("json", json); 80 UnityWebRequest webRequest = UnityWebRequest.Post(url, form); 81 TestGameEntry.Instance.StartCoroutine(Request(webRequest)); 82 } 83 84 private IEnumerator Request(UnityWebRequest webRequest) 85 { 86 yield return webRequest.SendWebRequest(); 87 m_IsBusy = false; 88 if (webRequest.result != UnityWebRequest.Result.Success) 89 { 90 m_CallBackArgs.HasError = true; 91 m_CallBackArgs.ErrorValue = webRequest.error; 92 m_SendCallBack?.Invoke(m_CallBackArgs); 93 if (!m_IsGetData) 94 { 95 Debug.Log("<color=#00eaff>接收訊息:</color><color=#00ff9c>" + webRequest.url + "</color>"); 96 Debug.Log("<color=#c5e1dc>==>>" + JsonUtility.ToJson(m_CallBackArgs) + "</color>"); 97 } 98 } 99 else 100 { 101 m_CallBackArgs.HasError = false; 102 m_CallBackArgs.Value = webRequest.downloadHandler.text; 103 //webRequest.downloadHandler.data 資料是位元組陣列,序列化也序列化不出來內容 非GetData列印日誌,並在data賦值之前列印 104 if (!m_IsGetData) 105 { 106 Debug.Log("<color=#00eaff>接收訊息:</color><color=#00ff9c>" + webRequest.url + "</color>"); 107 Debug.Log("<color=#c5e1dc>==>>" + JsonUtility.ToJson(m_CallBackArgs) + "</color>"); 108 } 109 m_CallBackArgs.Data = webRequest.downloadHandler.data; 110 m_SendCallBack?.Invoke(m_CallBackArgs); 111 } 112 TestGameEntry.PoolMgr.Class_Equeue(m_CallBackArgs); 113 webRequest.Dispose(); 114 webRequest = null; 115 TestGameEntry.PoolMgr.Class_Equeue(this); 116 } 117 }