void RenderGetOrDeleteImplementation(CodeExpression httpMethodInvokeExpression) { //Create function parameters var parameters = description.ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression() { Name = d.Name, Type = poco2CsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), }).ToArray(); method.Parameters.AddRange(parameters); var jsUriQuery = UriQueryHelper.CreateUriQuery(description.RelativePath, description.ParameterDescriptions); var uriText = jsUriQuery == null ? $"new Uri(this.baseUri, \"{description.RelativePath}\")" : RemoveTrialEmptyString($"new Uri(this.baseUri, \"{jsUriQuery}\")"); method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "requestUri", new CodeSnippetExpression(uriText))); //Statement: var result = this.client.GetAsync(requestUri.ToString()).Result; method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "responseMessage", httpMethodInvokeExpression)); ////Statement: var result = task.Result; var resultReference = new CodeVariableReferenceExpression("responseMessage"); //Statement: result.EnsureSuccessStatusCode(); method.Statements.Add(new CodeMethodInvokeExpression(resultReference, "EnsureSuccessStatusCode")); //Statement: return something; if (returnType != null) { AddReturnStatement(); } }
void RenderPostOrPutImplementation(bool isPost) { //Create function parameters in prototype var parameters = description.ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression() { Name = d.Name, Type = poco2CsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), }).ToArray(); method.Parameters.AddRange(parameters); var fromBodyParameterDescriptions = description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody || (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) || (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray(); if (fromBodyParameterDescriptions.Length > 1) { throw new CodeGenException("Bad Api Definition") { Description = String.Format("This API function {0} has more than 1 FromBody bindings in parameters", description.ActionDescriptor.ActionName) }; } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); void AddRequestUriWithQueryAssignmentStatement() { var jsUriQuery = UriQueryHelper.CreateUriQuery(description.RelativePath, description.ParameterDescriptions); string uriText; if (diFriendly) { uriText = jsUriQuery == null ? $"\"{description.RelativePath}\"" : RemoveTrialEmptyString($"\"{jsUriQuery}\""); } else { uriText = jsUriQuery == null ? $"new Uri(this.baseUri, \"{description.RelativePath}\")" : RemoveTrialEmptyString($"new Uri(this.baseUri, \"{jsUriQuery}\")"); } method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "requestUri", new CodeSnippetExpression(uriText))); } void AddPostStatement(CodeExpression httpMethodInvokeExpression) { //Statement: var task = this.client.GetAsync(requestUri.ToString()); method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "responseMessage", httpMethodInvokeExpression)); } AddRequestUriWithQueryAssignmentStatement(); if (singleFromBodyParameterDescription != null) { method.Statements.Add(new CodeSnippetStatement( @" using (var requestWriter = new System.IO.StringWriter()) { var requestSerializer = JsonSerializer.Create();" )); method.Statements.Add(new CodeMethodInvokeExpression(new CodeSnippetExpression("requestSerializer"), "Serialize", new CodeSnippetExpression("requestWriter"), new CodeSnippetExpression(singleFromBodyParameterDescription.ParameterDescriptor.ParameterName))); method.Statements.Add(new CodeSnippetStatement( @" var content = new StringContent(requestWriter.ToString(), System.Text.Encoding.UTF8, ""application/json"");" )); if (forAsync) { AddPostStatement( new CodeMethodInvokeExpression(new CodeSnippetExpression("await " + sharedContext.ClientReference.FieldName), isPost ? "PostAsync" : "PutAsync", new CodeSnippetExpression("requestUri") , new CodeSnippetExpression("content"))); } else { AddPostStatement(new CodePropertyReferenceExpression( new CodeMethodInvokeExpression(sharedContext.ClientReference, isPost ? "PostAsync" : "PutAsync", new CodeSnippetExpression("requestUri") , new CodeSnippetExpression("content")) , "Result")); } } else { if (forAsync) { AddPostStatement( new CodeMethodInvokeExpression(new CodeSnippetExpression("await " + sharedContext.ClientReference.FieldName), isPost ? "PostAsync" : "PutAsync" , new CodeSnippetExpression("requestUri") , new CodeSnippetExpression("new StringContent(String.Empty)"))); } else { AddPostStatement(new CodePropertyReferenceExpression( new CodeMethodInvokeExpression(sharedContext.ClientReference, isPost ? "PostAsync" : "PutAsync" , new CodeSnippetExpression("requestUri") , new CodeSnippetExpression("new StringContent(String.Empty)")) , "Result")); } } var resultReference = new CodeVariableReferenceExpression("responseMessage"); if (returnTypeIsStream) { method.Statements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode)); //Statement: return something; if (returnType != null) { AddReturnStatement(method.Statements); } } else { CodeTryCatchFinallyStatement try1 = new CodeTryCatchFinallyStatement(); method.Statements.Add(try1); try1.TryStatements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode)); //Statement: return something; if (returnType != null) { AddReturnStatement(try1.TryStatements); } try1.FinallyStatements.Add(new CodeMethodInvokeExpression(resultReference, "Dispose")); } if (singleFromBodyParameterDescription != null) { method.Statements.Add(new CodeSnippetStatement("\t\t\t}")); } }
void RenderGetOrDeleteImplementation(CodeExpression httpMethodInvokeExpression) { //Create function parameters var parameters = description.ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression() { Name = d.Name, Type = poco2CsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), }).ToArray(); method.Parameters.AddRange(parameters); var jsUriQuery = UriQueryHelper.CreateUriQuery(description.RelativePath, description.ParameterDescriptions); string uriText; if (diFriendly) { uriText = jsUriQuery == null ? $"\"{description.RelativePath}\"" : RemoveTrialEmptyString($"\"{jsUriQuery}\""); } else { uriText = jsUriQuery == null ? $"new Uri(this.baseUri, \"{description.RelativePath}\")" : RemoveTrialEmptyString($"new Uri(this.baseUri, \"{jsUriQuery}\")"); } method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "requestUri", new CodeSnippetExpression(uriText))); //Statement: var result = this.client.GetAsync(requestUri.ToString()).Result; method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "responseMessage", httpMethodInvokeExpression)); ////Statement: var result = task.Result; var resultReference = new CodeVariableReferenceExpression("responseMessage"); //Statement: result.EnsureSuccessStatusCode(); if (returnTypeIsStream) { method.Statements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode)); if (returnType != null) { //Debug.Assert(!returnType.FullName.Contains("JObject")); AddReturnStatement(method.Statements); } } else { CodeTryCatchFinallyStatement try1 = new CodeTryCatchFinallyStatement(); try1.TryStatements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode)); method.Statements.Add(try1); //Statement: return something; if (returnType != null) { //Debug.Assert(!returnType.FullName.Contains("JObject")); AddReturnStatement(try1.TryStatements); } try1.FinallyStatements.Add(new CodeMethodInvokeExpression(resultReference, "Dispose")); } }
void RenderPostOrPutImplementation(string httpMethod, bool forAsync) { //Create function parameters in prototype var parameters = description.ParameterDescriptions.Where(p => p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri || p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromQuery || p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody || p.ParameterDescriptor.ParameterBinder == ParameterBinder.None).Select(d => new CodeParameterDeclarationExpression() { Name = d.Name, Type = poco2CsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), }).ToArray(); method.Parameters.AddRange(parameters); if (settings.HandleHttpRequestHeaders) { method.Parameters.Add(new CodeParameterDeclarationExpression( "Action<System.Net.Http.Headers.HttpRequestHeaders>", "handleHeaders = null")); } var fromBodyParameterDescriptions = description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody || (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) || (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray(); if (fromBodyParameterDescriptions.Length > 1) { throw new CodeGenException("Bad Api Definition") { Description = String.Format("This API function {0} has more than 1 FromBody bindings in parameters", description.ActionDescriptor.ActionName) }; } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); void AddRequestUriWithQueryAssignmentStatement() { var jsUriQuery = UriQueryHelper.CreateUriQuery(description.RelativePath, description.ParameterDescriptions); string uriText = jsUriQuery == null ? $"\"{description.RelativePath}\"" : RemoveTrialEmptyString($"\"{jsUriQuery}\""); method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "requestUri", new CodeSnippetExpression(uriText))); } AddRequestUriWithQueryAssignmentStatement(); method.Statements.Add(new CodeSnippetStatement( $@" using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.{httpMethod}, requestUri)) {{" )); if (singleFromBodyParameterDescription != null) { method.Statements.Add(new CodeSnippetStatement( @" using (var requestWriter = new System.IO.StringWriter()) { var requestSerializer = JsonSerializer.Create(jsonSerializerSettings);" )); method.Statements.Add(new CodeMethodInvokeExpression(new CodeSnippetExpression("requestSerializer"), "Serialize", new CodeSnippetExpression("requestWriter"), new CodeSnippetExpression(singleFromBodyParameterDescription.ParameterDescriptor.ParameterName))); method.Statements.Add(new CodeSnippetStatement( @" var content = new StringContent(requestWriter.ToString(), System.Text.Encoding.UTF8, ""application/json"");" )); method.Statements.Add(new CodeSnippetStatement(@" httpRequestMessage.Content = content;")); if (settings.HandleHttpRequestHeaders) { method.Statements.Add(new CodeSnippetStatement(@" if (handleHeaders != null) { handleHeaders(httpRequestMessage.Headers); } ")); } method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "responseMessage", forAsync ? new CodeSnippetExpression("await client.SendAsync(httpRequestMessage)") : new CodeSnippetExpression("client.SendAsync(httpRequestMessage).Result"))); } else { method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "responseMessage", forAsync ? new CodeSnippetExpression("await client.SendAsync(httpRequestMessage)") : new CodeSnippetExpression("client.SendAsync(httpRequestMessage).Result"))); } var resultReference = new CodeVariableReferenceExpression("responseMessage"); if (returnTypeIsStream) { method.Statements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode)); //Statement: return something; if (returnType != null) { AddReturnStatement(method.Statements); } } else { CodeTryCatchFinallyStatement try1 = new CodeTryCatchFinallyStatement(); method.Statements.Add(try1); try1.TryStatements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode)); //Statement: return something; if (returnType != null) { AddReturnStatement(try1.TryStatements); } try1.FinallyStatements.Add(new CodeMethodInvokeExpression(resultReference, "Dispose")); } if (singleFromBodyParameterDescription != null) { method.Statements.Add(new CodeSnippetStatement("\t\t\t}")); } method.Statements.Add(new CodeSnippetStatement("\t\t\t}")); }
/// <summary> /// /// </summary> /// <param name="httpMethod">GET, DELETE, POST, PUT</param> /// <param name="forAsync"></param> void RenderGetOrDeleteImplementation(string httpMethod, bool forAsync) { CodeParameterDeclarationExpression[] parameters = description.ParameterDescriptions.Where(p => p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri || p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromQuery || p.ParameterDescriptor.ParameterBinder == ParameterBinder.None) .Select(d => new CodeParameterDeclarationExpression(poco2CsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name)) .ToArray(); method.Parameters.AddRange(parameters); if (settings.HandleHttpRequestHeaders) { method.Parameters.Add(new CodeParameterDeclarationExpression( "Action<System.Net.Http.Headers.HttpRequestHeaders>", "handleHeaders = null")); } var jsUriQuery = UriQueryHelper.CreateUriQuery(description.RelativePath, description.ParameterDescriptions); string uriText = jsUriQuery == null ? $"\"{description.RelativePath}\"" : RemoveTrialEmptyString($"\"{jsUriQuery}\""); method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "requestUri", new CodeSnippetExpression(uriText))); method.Statements.Add(new CodeSnippetStatement( $@" using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.{httpMethod}, requestUri)) {{" )); if (settings.HandleHttpRequestHeaders) { method.Statements.Add(new CodeSnippetStatement( $@" if (handleHeaders != null) {{ handleHeaders(httpRequestMessage.Headers); }} " )); } method.Statements.Add(new CodeVariableDeclarationStatement( new CodeTypeReference("var"), "responseMessage", forAsync ? new CodeSnippetExpression("await client.SendAsync(httpRequestMessage)") : new CodeSnippetExpression("client.SendAsync(httpRequestMessage).Result"))); CodeVariableReferenceExpression resultReference = new CodeVariableReferenceExpression("responseMessage"); //Statement: result.EnsureSuccessStatusCode(); if (returnTypeIsStream) { method.Statements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode)); if (returnType != null) { //Debug.Assert(!returnType.FullName.Contains("JObject")); AddReturnStatement(method.Statements); } method.Statements.Add(new CodeSnippetStatement("\t\t\t}")); } else { CodeTryCatchFinallyStatement try1 = new CodeTryCatchFinallyStatement(); try1.TryStatements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode)); method.Statements.Add(try1); //Statement: return something; if (returnType != null) { //Debug.Assert(!returnType.FullName.Contains("JObject")); AddReturnStatement(try1.TryStatements); } try1.FinallyStatements.Add(new CodeMethodInvokeExpression(resultReference, "Dispose")); method.Statements.Add(new CodeSnippetStatement("\t\t\t}")); } }