mergemilitary/Assets/MMOModule/Scripts/MMOCore/MMOAPIRequestManager/MMOAPIRequestUnit.cs

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;
}
}
}