using UnityEngine; using UnityEngine.Networking; using System; using System.Net; namespace Unity3dAzure.AppServices { public abstract class RestRequest : IDisposable { public UnityWebRequest request { get; private set; } public RestRequest (string url, Method method) { request = new UnityWebRequest (url, method.ToString ()); request.downloadHandler = new DownloadHandlerBuffer (); } public void AddHeader (string key, string value) { request.SetRequestHeader (key, value); } public void AddBody (byte[] bytes, string contentType) { if (request.uploadHandler != null) { Debug.LogWarning ("Request body can only be set once"); return; } request.uploadHandler = new UploadHandlerRaw (bytes); request.uploadHandler.contentType = contentType; } public virtual void AddBody (T data, string contentType = "application/json; charset=utf-8") { string jsonString = JsonUtility.ToJson (data); byte[] bytes = DataHelper.ToUTF8Bytes (jsonString); this.AddBody (bytes, contentType); } #region Response and json object parsing private RestResult GetRestResult() { HttpStatusCode statusCode = (HttpStatusCode)Enum.Parse(typeof(HttpStatusCode), request.responseCode.ToString()); RestResult result = new RestResult(statusCode); if (result.IsError) { result.ErrorMessage = "Response failed with status: " + statusCode.ToString(); return result; } if (string.IsNullOrEmpty(request.downloadHandler.text)) { result.IsError = true; result.ErrorMessage = "Response has empty body"; return result; } return result; } /// /// Shared method to return response result whether an object or array of objects /// private RestResult TryParseJsonArray () { RestResult result = GetRestResult(); // try parse an array of objects try { result.AnArrayOfObjects = JsonHelper.FromJsonArray(request.downloadHandler.text); } catch (Exception e) { result.IsError = true; result.ErrorMessage = "Failed to parse an array of objects of type: " + typeof(T).ToString() + " Exception message: " + e.Message; } return result; } private RestResult TryParseJson() { RestResult result = GetRestResult(); // try parse an object try { result.AnObject = JsonUtility.FromJson(request.downloadHandler.text); } catch (Exception e) { result.IsError = true; result.ErrorMessage = "Failed to parse object of type: " + typeof(T).ToString() + " Exception message: " + e.Message; } return result; } /// /// Parses object with T data = JsonUtil.FromJson, then callback RestResponse /// public void ParseJson (Action> callback = null) { RestResult result = TryParseJson (); if (result.IsError) { Debug.LogWarning ("Response error status:" + result.StatusCode + " code:" + request.responseCode + " error:" + result.ErrorMessage + " request url:" + request.url); callback (new RestResponse (result.ErrorMessage, result.StatusCode, request.url, request.downloadHandler.text)); } else { callback (new RestResponse (result.StatusCode, request.url, request.downloadHandler.text, result.AnObject)); } this.Dispose(); } /// /// Parses array of objects with T[] data = JsonHelper.GetJsonArray, then callback RestResponse /// public void ParseJsonArray (Action> callback = null) { RestResult result = TryParseJsonArray (); if (result.IsError) { Debug.LogWarning ("Response error status:" + result.StatusCode + " code:" + request.responseCode + " error:" + result.ErrorMessage + " request url:" + request.url); callback (new RestResponse (result.ErrorMessage, result.StatusCode, request.url, request.downloadHandler.text)); } else { callback (new RestResponse (result.StatusCode, request.url, request.downloadHandler.text, result.AnArrayOfObjects)); } this.Dispose(); } // *WSA private RestResult TryParseJsonNestedArray(string namedArray) where N : INestedResults, new() { RestResult result = GetRestResult(); // try parse an object try { result.AnObject = JsonHelper.FromJsonNestedArray(request.downloadHandler.text, namedArray); //JsonUtility.FromJson(request.downloadHandler.text); } catch (Exception e) { result.IsError = true; result.ErrorMessage = "Failed to parse object of type: " + typeof(N).ToString() + " Exception message: " + e.Message; } return result; } // Work-around for nested array public void ParseJsonNestedArray(string namedArray, Action> callback = null) where N : INestedResults, new() { RestResult result = TryParseJsonNestedArray(namedArray); if (result.IsError) { Debug.LogWarning("Response error status:" + result.StatusCode + " code:" + request.responseCode + " error:" + result.ErrorMessage + " request url:" + request.url); callback(new RestResponse(result.ErrorMessage, result.StatusCode, request.url, request.downloadHandler.text)); } else { callback(new RestResponse(result.StatusCode, request.url, request.downloadHandler.text, result.AnObject)); } this.Dispose(); } public void Dispose() { request.Dispose(); // request completed, clean-up resources } #endregion } }