111 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using System; | |||
|  | using System.Collections; | |||
|  | using System.Collections.Generic; | |||
|  | using UnityEngine; | |||
|  | using UnityEngine.Networking; | |||
|  | 
 | |||
|  | namespace MMO | |||
|  | { | |||
|  |     public class MMOAPIRequestUnit : MonoBehaviour | |||
|  |     { | |||
|  |         public Action<MMOAPIRequestUnit> DelOver; | |||
|  | 
 | |||
|  |         public string RequestURL; | |||
|  |         private bool mRequestStarted = false; | |||
|  |         private float mTimer = 0; | |||
|  |         private const float TIME_OUT_SECONDS = 15; | |||
|  |         private Action<int> mErrorCallback; | |||
|  | 
 | |||
|  |         private void Update() | |||
|  |         { | |||
|  |             if (mRequestStarted) | |||
|  |             { | |||
|  |                 mTimer += Time.unscaledDeltaTime; | |||
|  |                 if (mTimer >= TIME_OUT_SECONDS) | |||
|  |                 { | |||
|  |                     Timeout(); | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         public void SendRequest<T, U>(T pRequestData, Action<U> pRespondCallback = null, Action<int> 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<U>(string pUrl, byte[] pPostBytes, Action<U> pRespondCallback = null, Action<int> 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<U> tData = JsonUtility.FromJson<APIRespond<U>>(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<U> | |||
|  |         { | |||
|  |             public int status; | |||
|  |             public string error_msg; | |||
|  |             public U data; | |||
|  |         } | |||
|  |     } | |||
|  | } |