using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; namespace MMO { public class MMOAPIRequestUnit : MonoBehaviour { public Action DelOver; public string RequestURL; private bool mRequestStarted = false; private float mTimer = 0; private const float TIME_OUT_SECONDS = 15; private Action mErrorCallback; private void Update() { if (mRequestStarted) { mTimer += Time.unscaledDeltaTime; if (mTimer >= TIME_OUT_SECONDS) { Timeout(); } } } public void SendRequest(T pRequestData, Action pRespondCallback = null, Action pErrorCallback = null) where T : MMORequestBase { #if UNITY_EDITOR Debug.Log(string.Format("API {0} request data:{1}", typeof(T).Name, pRequestData.RequestJson())); Debug.Log(string.Format("API {0} request text:{1}", typeof(T).Name, MMOEncrypt.AESEncrypt(pRequestData.RequestJson()))); #endif byte[] tPostBytes = System.Text.Encoding.Default.GetBytes(MMOEncrypt.AESEncrypt(pRequestData.RequestJson())); mErrorCallback = pErrorCallback; mRequestStarted = true; mTimer = 0; RequestURL = pRequestData.RequestURL; StartCoroutine(PostRequest(pRequestData.RequestURL, tPostBytes, pRespondCallback, pErrorCallback)); } IEnumerator PostRequest(string pUrl, byte[] pPostBytes, Action pRespondCallback = null, Action pErrorCallback = null) { UnityWebRequest tRequest = new UnityWebRequest(pUrl, "POST"); tRequest.uploadHandler = new UploadHandlerRaw(pPostBytes); tRequest.downloadHandler = new DownloadHandlerBuffer(); tRequest.SetRequestHeader("Content-Type", "application/json"); yield return tRequest.SendWebRequest(); Debug.Log("Status Code: " + tRequest.responseCode); #if UNITY_2020_1_OR_NEWER if (tRequest.result == UnityWebRequest.Result.ConnectionError || tRequest.result == UnityWebRequest.Result.ProtocolError || tRequest.result == UnityWebRequest.Result.DataProcessingError) #else if (tRequest.isNetworkError || tRequest.isHttpError) #endif { pErrorCallback?.Invoke((int)tRequest.responseCode); Debug.LogError(tRequest.error); } #if UNITY_2020_1_OR_NEWER else if (tRequest.result == UnityWebRequest.Result.Success) #else else #endif { APIRespond tData = JsonUtility.FromJson>(MMOEncrypt.AESDecrypt(tRequest.downloadHandler.text)); #if UNITY_EDITOR Debug.Log(string.Format("API {0} respond text:{1}", typeof(U).Name, tRequest.downloadHandler.text)); Debug.Log(string.Format("API {0} respond data:{1}", typeof(U).Name, MMOEncrypt.AESDecrypt(tRequest.downloadHandler.text))); #endif if (tData.status == 1) { pRespondCallback?.Invoke(tData.data); } else { pErrorCallback?.Invoke(tData.status); } } Over(); } private void Timeout() { StopAllCoroutines(); mErrorCallback?.Invoke(-1); Over(); } private void Over() { mRequestStarted = false; DelOver?.Invoke(this); } [Serializable] public class APIRespond { public int status; public string error_msg; public U data; } } }