using System.Net.Http; using System.Text; using System.Threading.Tasks; using UnityEditor; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; public class HttpClient { public static string latestServerResponse; private readonly ISerializeOption _serializationOption; public HttpClient(ISerializeOption serializationOption) { _serializationOption = serializationOption; } /// /// Async method that handles communication with REST server. /// /// The coroutine. /// API url. /// Callback on success. /// Callback on fail. /// Data Model Type. public async Task Get(string url, UnityAction callbackOnSuccess, UnityAction callbackOnFail, string authorizationToken = null) { // Empty request to be able to reference it in the `except` block UnityWebRequest webRequest = new UnityWebRequest(); try { Debug.Log($"Requesting from URL {url}"); //webRequest = UnityWebRequest.Get(url); webRequest = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET); webRequest.uploadHandler = new UploadHandlerRaw(null); webRequest.uploadHandler.contentType = _serializationOption.ContentType; webRequest.downloadHandler = new DownloadHandlerBuffer(); webRequest.SetRequestHeader(_serializationOption.ContentTypeHeader, _serializationOption.ContentType); if (authorizationToken != null) webRequest.SetRequestHeader("Authorization", $"Bearer {authorizationToken}"); UnityWebRequestAsyncOperation asyncOp = webRequest.SendWebRequest(); while (!asyncOp.isDone) await Task.Yield(); // Process results if (webRequest.result == UnityWebRequest.Result.Success) { latestServerResponse = webRequest.downloadHandler.text; //Debug.Log(latestServerResponse); // Parse response to specific class T result = _serializationOption.ParseResponse(latestServerResponse); callbackOnSuccess?.Invoke(result); return result; } else { Debug.LogError(webRequest.error); callbackOnFail?.Invoke(webRequest.error); return default; } } catch (System.Exception ex) { Debug.LogWarning($"{nameof(Get)} could not parse json response. {ex.Message}"); callbackOnFail?.Invoke(ex.Message); return default; } } /// /// Async method that handles communication with REST server. /// /// The coroutine. /// API url. /// Callback on success. /// Callback on fail. /// Data Model Type. public async Task Post(string url, string data, UnityAction callbackOnSuccess, UnityAction callbackOnFail, string authorizationToken = null, string requestType = UnityWebRequest.kHttpVerbPOST) { try { if (data == null) { Debug.LogError("POST: `data` is null"); return default; } // Initialize webrequest UnityWebRequest webRequest = new UnityWebRequest(url, requestType); byte[] dataBytes = Encoding.UTF8.GetBytes(data); webRequest.uploadHandler = new UploadHandlerRaw(dataBytes); //UnityWebRequest webRequest = UnityWebRequest.Post(url, data); // Not working, it should be sent as bytes webRequest.uploadHandler.contentType = _serializationOption.ContentType; webRequest.downloadHandler = new DownloadHandlerBuffer(); webRequest.SetRequestHeader(_serializationOption.ContentTypeHeader, _serializationOption.ContentType); if (authorizationToken != null) webRequest.SetRequestHeader("Authorization", $"Bearer {authorizationToken}"); UnityWebRequestAsyncOperation asyncOp = webRequest.SendWebRequest(); while (!asyncOp.isDone) await Task.Yield(); // Fetch response regardless result latestServerResponse = webRequest.downloadHandler.text; // Process results if (webRequest.result == UnityWebRequest.Result.Success) { // Parse response to specific class T result = _serializationOption.ParseResponse(latestServerResponse); callbackOnSuccess?.Invoke(result); return result; } else { callbackOnFail?.Invoke(webRequest.error + "\n" + webRequest.downloadHandler.text); return default; } } catch (System.Exception ex) { Debug.LogWarning($"{nameof(Get)} could not parse json response. {ex.Message}"); callbackOnFail?.Invoke(ex.Message); return default; } } /// /// Async method that handles communication with REST server. /// /// The coroutine. /// API url. /// Callback on success. /// Callback on fail. /// Data Model Type. public async Task Update(string url, string data, UnityAction callbackOnSuccess, UnityAction callbackOnFail, string authorizationToken = null) { return await Post(url, data, callbackOnSuccess, callbackOnFail, authorizationToken, requestType: UnityWebRequest.kHttpVerbPUT); } }