Files
2026-02-23 18:37:31 +01:00

150 lines
6.0 KiB
C#

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;
}
/// <summary>
/// Async method that handles communication with REST server.
/// </summary>
/// <returns>The coroutine.</returns>
/// <param name="url">API url.</param>
/// <param name="callbackOnSuccess">Callback on success.</param>
/// <param name="callbackOnFail">Callback on fail.</param>
/// <typeparam name="T">Data Model Type.</typeparam>
public async Task<T> Get<T>(string url, UnityAction<T> callbackOnSuccess, UnityAction<string> 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<T>(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;
}
}
/// <summary>
/// Async method that handles communication with REST server.
/// </summary>
/// <returns>The coroutine.</returns>
/// <param name="url">API url.</param>
/// <param name="callbackOnSuccess">Callback on success.</param>
/// <param name="callbackOnFail">Callback on fail.</param>
/// <typeparam name="T">Data Model Type.</typeparam>
public async Task<T> Post<T>(string url, string data, UnityAction<T> callbackOnSuccess, UnityAction<string> 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<T>(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;
}
}
/// <summary>
/// Async method that handles communication with REST server.
/// </summary>
/// <returns>The coroutine.</returns>
/// <param name="url">API url.</param>
/// <param name="callbackOnSuccess">Callback on success.</param>
/// <param name="callbackOnFail">Callback on fail.</param>
/// <typeparam name="T">Data Model Type.</typeparam>
public async Task<T> Update<T>(string url, string data, UnityAction<T> callbackOnSuccess, UnityAction<string> callbackOnFail, string authorizationToken = null)
{
return await Post<T>(url, data, callbackOnSuccess, callbackOnFail, authorizationToken, requestType: UnityWebRequest.kHttpVerbPUT);
}
}