void ApiRequest <T>(string endpoint, Action <RestRequest> arguments, Action <T> onSuccess, Action <string> onError) { var client = new RestClient(GhostVREndpoint); var request = new RestRequest(endpoint, Method.POST); if (Token.HasValue) { request.AddHeader("Authorization", "Bearer " + Token.Value); } arguments(request); logger.Info($"API request: {endpoint} {request} token={(Token.HasValue ? Token.Value.ToString() : "(none)")}"); client.ExecuteAsync(request, (response, request_) => { try { if (response.ErrorException != null) { logger.Error("Cannot connect to GhostVR API: " + response.ErrorMessage); onError("Cannot connect to GhostVR API: " + response.ErrorMessage); potentialAuthError = true; return; } ApiResponse apiResponse = JsonConvert.DeserializeObject <ApiResponse>(response.Content); if (apiResponse.status == ApiResponse.ApiStatus.success) { ApiResponseSuccess <T> apiResponseSuccess = JsonConvert.DeserializeObject <ApiResponseSuccess <T> >(response.Content); logger.Info("ApiRequest success: " + endpoint); onSuccess(apiResponseSuccess.data); } else { ApiResponseError apiResponseError = JsonConvert.DeserializeObject <ApiResponseError>(response.Content); logger.Error($"ApiRequest error: {endpoint}, {apiResponseError.status} {apiResponseError.message} ({apiResponseError.code})"); onError($"{apiResponseError.status} {apiResponseError.message} ({apiResponseError.code})"); potentialAuthError = true; } } catch (Exception e) { logger.Error("ApiRequest parse error:" + endpoint + e); onError("an exception occurred: " + e); potentialAuthError = true; } }); }
private async Task <T> GetAsync <T>(string url) { HttpResponseMessage response = await client.GetAsync(url); if (response.IsSuccessStatusCode) { ApiResponseSuccess <T> responseData = await response.Content.ReadAsAsync <ApiResponseSuccess <T> >(); return(responseData.Data); } else { ApiResponseFail responseData = await response.Content.ReadAsAsync <ApiResponseFail>(); throw new ClientHttpException(responseData.Message, response); } }
//OnActionExecuting – 在執行 Action 之前執行 //OnActionExecuted – 在執行 Action 之後執行 //OnResultExecuting – 在執行 Action Result 之前執行 //OnResultExecuted – 在執行 Action Result 之後執行 public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { //過去不指定回傳格式 if (actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes <NoPara>().Any()) { return; } base.OnActionExecuted(actionExecutedContext); if (actionExecutedContext.Exception != null) { return; } var data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync <object>().Result; if (actionExecutedContext.Response.StatusCode == HttpStatusCode.Forbidden && data is List <ValidatorErrorResult> ) { var fail = new ValidatorFailOutputModel() { ApiVersion = "1.0.0", Method = string.Format("{0}.{1}", actionExecutedContext.Request.RequestUri.AbsolutePath, actionExecutedContext.Request.Method), Status = "ERROR", Error = data, Id = Guid.NewGuid(), }; actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(fail); } else { var result = new ApiResponseSuccess { apiVersion = "1.0.0", status = "SUCCESS", method = $"{ actionExecutedContext.Request.RequestUri.AbsolutePath }.{ actionExecutedContext.Request.Method }", id = Guid.NewGuid(), //StatusCode = actionExecutedContext.ActionContext.Response.StatusCode, data = data }; // 重新封裝回傳格式 //actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(result.StatusCode, result); actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(result); } }