/// <summary> /// Executes multiple requests. Returns the status of the request to the api. /// The responses to the individual requests can be found in the respective request objects. /// </summary> /// <param name="feature">Special feature for the client to execute for the passed in requests.</param> public async Task <GameJoltResponse> ExecuteRequestsAsync(IEnumerable <IGameJoltRequest> requests, GameJoltApiRequestFeature feature = GameJoltApiRequestFeature.None) { var startTime = DateTime.Now; try { var data = await GetRequestData(requests, feature); var model = RootResponseModel.FromString(data); var endTime = DateTime.Now; if (model.BatchResponse.Success) { for (int i = 0; i < model.BatchResponse.Responses.Length; i++) { requests.ElementAt(i).SetResponse(model.BatchResponse.Responses[i]); requests.ElementAt(i).SetTimingResult(startTime, endTime); } } else { int startIndex = 0; if (model.BatchResponse != null && model.BatchResponse.Responses != null) { startIndex = model.BatchResponse.Responses.Length; for (int i = 0; i < model.BatchResponse.Responses.Length; i++) { requests.ElementAt(i).SetResponse(model.BatchResponse.Responses[i]); requests.ElementAt(i).SetTimingResult(startTime, endTime); } } for (int i = startIndex; i < requests.Count(); i++) { requests.ElementAt(i).SetResponse(GetSubRequestErrorModel(feature == GameJoltApiRequestFeature.BreakOnError)); requests.ElementAt(i).SetTimingResult(startTime, endTime); } } return(new GameJoltResponse(model)); } catch (Exception ex) { var endTime = DateTime.Now; for (int i = 0; i < requests.Count(); i++) { requests.ElementAt(i).SetResponse(GetSubRequestErrorModel(false)); requests.ElementAt(i).SetTimingResult(startTime, endTime); } return(new GameJoltResponse(ex.Message)); } }
private async Task <string> GetRequestData(IEnumerable <IGameJoltRequest> requests, GameJoltApiRequestFeature feature) { if (requests == null || requests.Count() == 0) { return(string.Empty); } // build url from parameters: string url = string.Format(FORMAT_REQUEST_URL, HOST, VERSION, GameId, FORMAT_JSON); if (feature == GameJoltApiRequestFeature.ParallelProcessing) { url += "¶llel=true"; } if (feature == GameJoltApiRequestFeature.BreakOnError) { url += "&break_on_error=true"; } // add signature to url: var urlSignature = CreateSignature(url); url += "&signature=" + urlSignature; // the request will be a POST request, and all actual api requests will be stored in the post data: StringBuilder postDataBuilder = new StringBuilder("data="); foreach (var gameJoltRequest in requests) { var requestUrl = gameJoltRequest.ComposeUrl(this); var requestUrlSignature = CreateSignature(requestUrl); requestUrl += "&signature=" + requestUrlSignature; postDataBuilder.Append("&requests[]=" + UrlEncoder.Encode(requestUrl)); } string postData = postDataBuilder.ToString(); var request = ComposeRequest(url, postData); using (var sw = new StreamWriter(await request.GetRequestStreamAsync())) { // write post data to stream: await sw.WriteAsync(postData); sw.Close(); // get request response, read from stream: var response = await request.GetResponseAsync(); using (var sr = new StreamReader(response.GetResponseStream())) { return(await sr.ReadToEndAsync()); } } }