150 lines
6.0 KiB
C#
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);
|
|
}
|
|
} |