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(); } }
protected override void RenderImplementation() { string httpMethodName = HttpMethod.ToString().ToLower(); //Method is always uppercase. //deal with parameters var parameters = ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression(TypeMapper.MapCodeTypeReferenceToTsText(d.ParameterTypeReference), d.Name)) .ToList(); var returnTypeText = TypeMapper.MapCodeTypeReferenceToTsText(ReturnTypeReference); if (returnTypeText == "any" || String.IsNullOrEmpty(returnTypeText) || returnTypeText == "response") { returnTypeText = "void"; } var callbackTypeText = String.Format("(data : {0}) => any", returnTypeText); Debug.WriteLine("callback: " + callbackTypeText); var callbackTypeReference = new CodeSnipetTypeReference(callbackTypeText); parameters.Add(new CodeParameterDeclarationExpression(callbackTypeReference, "callback")); Method.Parameters.AddRange(parameters.ToArray()); if (RequestBodyCodeTypeReference != null) { CodeParameterDeclarationExpression p = new CodeParameterDeclarationExpression(RequestBodyCodeTypeReference, "requestBody"); Method.Parameters.Add(p); } if (settings.HandleHttpRequestHeaders) { Method.Parameters.Add(new CodeParameterDeclarationExpression( "() => {[header: string]: string}", "headersHandler?")); } var jsUriQuery = UriQueryHelper.CreateUriQueryForTs(RelativePath, ParameterDescriptions); string uriText = jsUriQuery == null ? $"this.baseUri + '{RelativePath}'" : RemoveTrialEmptyString($"this.baseUri + '{jsUriQuery}'"); string headerHandlerCall = settings.HandleHttpRequestHeaders ? ", headersHandler" : String.Empty; if (httpMethodName == "get" || httpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"this.httpClient.{httpMethodName}({uriText}, callback, this.error, this.statusCode{headerHandlerCall});")); } else if (httpMethodName == "post" || httpMethodName == "put" || httpMethodName == "patch") { if (RequestBodyCodeTypeReference == null) // no body { Method.Statements.Add(new CodeSnippetStatement($"this.httpClient.{httpMethodName}({uriText}, null, callback, this.error, this.statusCode, '{contentType}'{headerHandlerCall});")); } else { Method.Statements.Add(new CodeSnippetStatement($"this.httpClient.{httpMethodName}({uriText}, requestBody, callback, this.error, this.statusCode, '{contentType}'{headerHandlerCall});")); } } else { Debug.Assert(false, $"How come with {httpMethodName}?"); } }
/// <summary> /// If the caller expect full uri path rather than relative path. /// </summary> /// <returns></returns> protected string GetFullUriText() { var jsUriQuery = UriQueryHelper.CreateUriQueryForTs(Description.RelativePath, Description.ParameterDescriptions); var hasArrayJoin = jsUriQuery != null && jsUriQuery.Contains(".join("); return(jsUriQuery == null ? $"this.baseUri + '{Description.RelativePath}'" : RemoveTrialEmptyString(hasArrayJoin ? $"this.baseUri + '{jsUriQuery}" : $"this.baseUri + '{jsUriQuery}'")); }
protected override void RenderImplementation() { var httpMethod = Description.HttpMethod.ToLower(); //Method is always uppercase. //deal with parameters var parameters = Description.ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name) ).ToList(); //parameters.Add(new CodeParameterDeclarationExpression(callbackTypeReference, "callback")); Method.Parameters.AddRange(parameters.ToArray()); var jsUriQuery = UriQueryHelper.CreateUriQueryForTs(Description.RelativePath, Description.ParameterDescriptions); var uriText = jsUriQuery == null ? $"this.baseUri + '{Description.RelativePath}'" : RemoveTrialEmptyString($"this.baseUri + '{jsUriQuery}'"); // var mapFunction = returnTypeText == NG2HttpResponse ? String.Empty : ".map(response=> response.json())"; if (httpMethod == "get" || httpMethod == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}<{returnTypeText}>({uriText}, {{ headers: {{ 'Accept': 'application/json' }} }});")); return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; if (String.IsNullOrEmpty(contentType)) { contentType = "application/json;charset=UTF-8"; } if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}<{returnTypeText}>({uriText}, '', {{ headers: {{ 'Accept': 'application/json' }} }});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethod}<{returnTypeText}>({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}', 'Accept': 'application/json' }} }});")); } return; } Debug.Assert(false, "How come?"); }
protected override void RenderImplementation() { var httpMethod = Description.HttpMethod.ToLower(); //Method is always uppercase. //deal with parameters var parameters = Description.ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name) ).ToList(); var returnTypeReference = Poco2TsGen.TranslateToClientTypeReference(ReturnType); if (returnTypeReference.BaseType == "response") //response is for NG2 with better built-in support for typing, and get translated to HttpResponse<Blob> { returnTypeReference.BaseType = "any"; } var callbackTypeText = String.Format("(data : {0}) => any", TypeMapper.MapCodeTypeReferenceToTsText(returnTypeReference)); Debug.WriteLine("callback: " + callbackTypeText); var callbackTypeReference = new CodeSnipetTypeReference(callbackTypeText); parameters.Add(new CodeParameterDeclarationExpression(callbackTypeReference, "callback")); Method.Parameters.AddRange(parameters.ToArray()); var jsUriQuery = UriQueryHelper.CreateUriQueryForTs(Description.RelativePath, Description.ParameterDescriptions); var hasArrayJoin = jsUriQuery != null && jsUriQuery.Contains(".join("); var uriText = jsUriQuery == null ? $"this.baseUri + '{Description.RelativePath}'" : RemoveTrialEmptyString(hasArrayJoin ? $"this.baseUri + '{jsUriQuery}" : $"this.baseUri + '{jsUriQuery}'"); if (httpMethod == "get" || httpMethod == "delete") { Method.Statements.Add(new CodeSnippetStatement($"this.httpClient.{httpMethod}({uriText}, callback, this.error, this.statusCode);")); return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; Method.Statements.Add(new CodeSnippetStatement($"this.httpClient.{httpMethod}({uriText}, {dataToPost}, callback, this.error, this.statusCode);")); return; } Debug.Assert(false, "How come?"); }
protected override string CreateUriQueryForTs(string uriText, ParameterDescription[] parameterDescriptions) { return(UriQueryHelper.CreateUriQueryForTs(uriText, parameterDescriptions)); }
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")); } }
protected override void RenderImplementation() { string httpMethodName = HttpMethod.ToString().ToLower(); //Method is always uppercase. //deal with parameters CodeParameterDeclarationExpression[] parameters = ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression(TypeMapper.MapCodeTypeReferenceToTsText(d.ParameterTypeReference), d.Name)) .ToArray(); Method.Parameters.AddRange(parameters); if (RequestBodyCodeTypeReference != null) { CodeParameterDeclarationExpression p = new CodeParameterDeclarationExpression(RequestBodyCodeTypeReference, "requestBody"); Method.Parameters.Add(p); } if (settings.HandleHttpRequestHeaders) { Method.Parameters.Add(new CodeParameterDeclarationExpression( "() => {[header: string]: string}", "headersHandler?")); } string jsUriQuery = UriQueryHelper.CreateUriQueryForTs(RelativePath, ParameterDescriptions); string uriText = jsUriQuery == null ? $"this.baseUri + '{RelativePath}'" : RemoveTrialEmptyString($"this.baseUri + '{jsUriQuery}'"); if (ReturnTypeReference != null && ReturnTypeReference.BaseType == "System.String" && ReturnTypeReference.ArrayElementType == null) //stringAsString is for .NET Core Web API { if (httpMethodName == "get" || httpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, {OptionsForString}).then(d => d.data);")); //todo: type cast is not really needed. return; } if (httpMethodName == "post" || httpMethodName == "put" || httpMethodName == "patch") { if (RequestBodyCodeTypeReference == null) { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, null, {OptionsForString}).then(d => d.data);")); } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, JSON.stringify(requestBody), {ContentOptionsForString}).then(d => d.data);")); } return; } } else if (returnTypeText == AxiosHttpStringResponse) //translated from response to this { if (httpMethodName == "get" || httpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, {OptionsForResponse});")); return; } if (httpMethodName == "post" || httpMethodName == "put" || httpMethodName == "patch") { if (RequestBodyCodeTypeReference == null) { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, null, {OptionsForResponse});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, JSON.stringify(requestBody), {ContentOptionsForResponse});")); } return; } } else if (returnTypeText == AxiosHttpResponse) // client should care about only status { if (httpMethodName == "get" || httpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, {Options});")); return; } if (httpMethodName == "post" || httpMethodName == "put" || httpMethodName == "patch") { if (RequestBodyCodeTypeReference == null) { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, null, {Options});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, JSON.stringify(requestBody), {ContentOptionsForString});")); } return; } } else { string returnTypeCast = returnTypeText == null ? String.Empty : $"<{returnTypeText}>"; if (httpMethodName == "get" || httpMethodName == "delete") { if (returnTypeText == null) { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, {OptionsForResponse});")); //only http response needed } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}{returnTypeCast}({uriText}, {Options}).then(d => d.data);")); } } else if (httpMethodName == "post" || httpMethodName == "put" || httpMethodName == "patch") { if (returnTypeText == null) //http response { if (RequestBodyCodeTypeReference == null) //no content body { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, null, {OptionsForResponse});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}({uriText}, JSON.stringify(requestBody), {ContentOptionsForResponse});")); } } else // type is returned { if (RequestBodyCodeTypeReference == null) // no body { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}{returnTypeCast}({uriText}, null, {Options}).then(d => d.data);")); } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethodName}{returnTypeCast}({uriText}, JSON.stringify(requestBody), {OptionsWithContent}).then(d => d.data);")); } } } else { Debug.Assert(false, $"How come with {httpMethodName}?"); } } }
protected override void RenderImplementation() { var httpMethod = Description.HttpMethod.ToLower(); //Method is always uppercase. //deal with parameters var parameters = Description.ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name) ).ToList(); //parameters.Add(new CodeParameterDeclarationExpression(callbackTypeReference, "callback")); Method.Parameters.AddRange(parameters.ToArray()); var jsUriQuery = UriQueryHelper.CreateUriQueryForTs(Description.RelativePath, Description.ParameterDescriptions); var uriText = jsUriQuery == null ? $"this.baseUri + '{Description.RelativePath}'" : RemoveTrialEmptyString($"this.baseUri + '{jsUriQuery}'"); // var mapFunction = returnTypeText == ReactHttpResponse ? String.Empty : ".map(response=> response.json())"; if (ReturnType != null && TypeHelper.IsStringType(ReturnType) && this.stringAsString) //stringAsString is for .NET Core Web API { if (httpMethod == "get" || httpMethod == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, {{ responseType: 'text' }}).then(d => d.data as {returnTypeText});")); return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; if (String.IsNullOrEmpty(contentType)) { contentType = "application/json;charset=UTF-8"; } if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, null, {{headers: {{ 'Content-Type': '{contentType}' }}, responseType: 'text' }}).then(d => d.data as {returnTypeText});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}' }}, responseType: 'text' }}).then(d => d.data as {returnTypeText});")); } return; } } else if (returnTypeText == AxiostHttpBlobResponse) //translated from blobresponse to this { const string optionForStream = "{ responseType: 'blob' }"; if (httpMethod == "get" || httpMethod == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, {optionForStream}).then(d => d.data as {returnTypeText});")); return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; //if (String.IsNullOrEmpty(contentType)) //{ // contentType = "application/json;charset=UTF-8"; //} if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, null, {optionForStream}).then(d => d.data as {returnTypeText});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {optionForStream}).then(d => d.data as {returnTypeText});")); } return; } } else if (returnTypeText == AxiosHttpStringResponse) //translated from response to this { const string optionForActionResult = "{ responseType: 'text' }"; if (httpMethod == "get" || httpMethod == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, {optionForActionResult}).then(d => d.data as {returnTypeText});")); return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, null, {optionForActionResult}).then(d => d.data as {returnTypeText});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}' }}, responseType: 'text' }}).then(d => d.data as {returnTypeText});")); } return; } } else if (returnTypeText == AxiosHttpResponse) // client should care about only status { const string optionForActionResult = "{ responseType: 'text' }"; if (httpMethod == "get" || httpMethod == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, {optionForActionResult});")); return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, null, {optionForActionResult});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}' }}, responseType: 'text' }});")); } return; } } else { if (httpMethod == "get" || httpMethod == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}).then(d => d.data as {returnTypeText});")); return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; if (String.IsNullOrEmpty(contentType)) { contentType = "application/json;charset=UTF-8"; } if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, null, {{ headers: {{ 'Content-Type': '{contentType}' }} }}).then(d => d.data as {returnTypeText});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return Axios.{httpMethod}({uriText}, JSON.stringify({dataToPost}), {{ headers: {{ 'Content-Type': '{contentType}' }} }}).then(d => d.data as {returnTypeText});")); } return; } } Debug.Assert(false, "How come?"); }
protected override void RenderImplementation() { var httpMethodName = HttpMethod.ToString().ToLower(); //Method is always uppercase. //deal with parameters var parameters = ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name)) .ToArray(); //parameters.Add(new CodeParameterDeclarationExpression(callbackTypeReference, "callback")); Method.Parameters.AddRange(parameters); if (RequestBodyCodeTypeReference != null) { var p = new CodeParameterDeclarationExpression(RequestBodyCodeTypeReference, "requestBody"); Method.Parameters.Add(p); } var jsUriQuery = UriQueryHelper.CreateUriQueryForTs(RelativePath, ParameterDescriptions); var uriText = jsUriQuery == null ? $"this.baseUri + '{RelativePath}'" : RemoveTrialEmptyString($"this.baseUri + '{jsUriQuery}'"); // var mapFunction = returnTypeText == NG2HttpResponse ? String.Empty : ".map(response=> response.json())"; if (ReturnTypeReference != null && ReturnTypeReference.BaseType == "System.String" && ReturnTypeReference.ArrayElementType == null) //stringAsString is for .NET Core Web API { if (httpMethodName == "get" || httpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, {{ responseType: 'text' }});")); return; } if (httpMethodName == "post" || httpMethodName == "put") { if (String.IsNullOrEmpty(contentType)) { contentType = "application/json;charset=UTF-8"; } if (RequestBodyCodeTypeReference == null) { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, null, {{headers: {{ 'Content-Type': '{contentType}' }}, responseType: 'text' }});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, JSON.stringify(requestBody), {{ headers: {{ 'Content-Type': '{contentType}' }}, responseType: 'text' }});")); } return; } } else if (returnTypeText == NG2HttpBlobResponse) //translated from blobresponse to this { const string optionForStream = "{ observe: 'response', responseType: 'blob' }"; if (httpMethodName == "get" || httpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, {optionForStream});")); return; } if (httpMethodName == "post" || httpMethodName == "put") { if (RequestBodyCodeTypeReference == null) { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, null, {optionForStream});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, JSON.stringify(requestBody), {optionForStream});")); } return; } } else if (returnTypeText == NG2HttpStringResponse) //translated from response to this { const string optionForActionResult = "{ observe: 'response', responseType: 'text' }"; if (httpMethodName == "get" || httpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, {optionForActionResult});")); return; } if (httpMethodName == "post" || httpMethodName == "put") { if (RequestBodyCodeTypeReference == null) { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, null, {optionForActionResult});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}({uriText}, JSON.stringify(requestBody), {{ headers: {{ 'Content-Type': '{contentType}' }}, observe: 'response', responseType: 'text' }});")); } return; } } else { var typeCast = returnTypeText == null ? "<Response>" : $"<{returnTypeText}>"; if (httpMethodName == "get" || httpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}{typeCast}({uriText});")); return; } if (httpMethodName == "post" || httpMethodName == "put") { if (String.IsNullOrEmpty(contentType)) { contentType = "application/json;charset=UTF-8"; } if (RequestBodyCodeTypeReference == null) { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}{typeCast}({uriText}, null, {{ headers: {{ 'Content-Type': '{contentType}' }} }});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{httpMethodName}{typeCast}({uriText}, JSON.stringify(requestBody), {{ headers: {{ 'Content-Type': '{contentType}' }} }});")); } return; } } Debug.Assert(false, "How come?"); }
protected override void RenderImplementation() { var httpMethodName = HttpMethod.ToString().ToLower(); string contentOptionsWithHeadersHandlerForString = $"{{ method: '{httpMethodName}', headers: headersHandler ? Object.assign(headersHandler(), {{ 'Content-Type': '{contentType}' }}): {{ 'Content-Type': '{contentType}' }}, body: JSON.stringify(requestBody) }}"; var ContentOptionsForString = settings.HandleHttpRequestHeaders ? contentOptionsWithHeadersHandlerForString : $"{{ method: '{httpMethodName}', headers: {{ 'Content-Type': '{contentType}' }}, body: JSON.stringify(requestBody) }}"; string contentOptionsWithHeadersHandlerForResponse = $"{{ method: '{httpMethodName}', headers: headersHandler ? Object.assign(headersHandler(), {{ 'Content-Type': '{contentType}' }}): {{ 'Content-Type': '{contentType}' }}, body: JSON.stringify(requestBody) }}"; var ContentOptionsForResponse = settings.HandleHttpRequestHeaders ? contentOptionsWithHeadersHandlerForResponse : $"{{ method: '{httpMethodName}', headers: {{ 'Content-Type': '{contentType}' }}, body: JSON.stringify(requestBody) }}"; string optionsWithHeadersHandlerAndContent = $"{{ method: '{httpMethodName}', headers: headersHandler ? Object.assign(headersHandler(), {{ 'Content-Type': '{contentType}' }}): {{ 'Content-Type': '{contentType}' }}, body: JSON.stringify(requestBody) }}"; var OptionsWithContent = settings.HandleHttpRequestHeaders ? optionsWithHeadersHandlerAndContent : $"{{ method: '{httpMethodName}', headers: {{ 'Content-Type': '{contentType}' }}, body: JSON.stringify(requestBody) }}"; string optionsWithHeadersHandlerForString = $"{{ method: '{httpMethodName}', headers: headersHandler ? headersHandler() : undefined }}"; var OptionsForString = settings.HandleHttpRequestHeaders ? optionsWithHeadersHandlerForString : $"{{ method: '{httpMethodName}' }}"; string optionsWithHeadersHandlerForResponse = $"{{ method: '{httpMethodName}', headers: headersHandler ? headersHandler() : undefined }}"; var OptionsForResponse = settings.HandleHttpRequestHeaders ? optionsWithHeadersHandlerForResponse : $"{{ method: '{httpMethodName}' }}"; string optionsWithHeadersHandler = $"{{ method: '{httpMethodName}', headers: headersHandler ? headersHandler() : undefined }}"; var Options = settings.HandleHttpRequestHeaders ? optionsWithHeadersHandler : $"{{ method: '{httpMethodName}' }}"; CodeParameterDeclarationExpression[] parameters = ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression(TypeMapper.MapCodeTypeReferenceToTsText(d.ParameterTypeReference), d.Name)) .ToArray(); Method.Parameters.AddRange(parameters); if (RequestBodyCodeTypeReference != null) { CodeParameterDeclarationExpression p = new CodeParameterDeclarationExpression(RequestBodyCodeTypeReference, "requestBody"); Method.Parameters.Add(p); } if (settings.HandleHttpRequestHeaders) { Method.Parameters.Add(new CodeParameterDeclarationExpression( "() => {[header: string]: string}", "headersHandler?")); } string jsUriQuery = UriQueryHelper.CreateUriQueryForTs(RelativePath, ParameterDescriptions); string uriText = jsUriQuery == null ? $"this.baseUri + '{RelativePath}'" : RemoveTrialEmptyString($"this.baseUri + '{jsUriQuery}'"); if (ReturnTypeReference != null && ReturnTypeReference.BaseType == "System.String" && ReturnTypeReference.ArrayElementType == null) //stringAsString is for .NET Core Web API { if (httpMethodName == "get" || httpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {OptionsForString}).then(d => d.text());")); //todo: type cast is not really needed. return; } if (httpMethodName == "post" || httpMethodName == "put" || httpMethodName == "patch") { if (RequestBodyCodeTypeReference == null) { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {OptionsForString}).then(d => d.text());")); } else { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {ContentOptionsForString}).then(d => d.text());")); } return; } } //else if (returnTypeText == FetchHttpStringResponse)//translated from response to this //{ // if (httpMethodName == "post" || httpMethodName == "put" || httpMethodName == "patch") // { // Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {OptionsForResponse}).then(d => d.text());")); // return; // } // if (httpMethodName == "post" || httpMethodName == "put" || httpMethodName == "patch") // { // if (RequestBodyCodeTypeReference == null) // { // Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, null, {OptionsForResponse}).then(d => d.text());")); // } // else // { // Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, JSON.stringify(requestBody), {ContentOptionsForResponse});")); // } // return; // } //} else if (returnTypeText == FetchHttpResponse) // client should care about only status { if (httpMethodName == "get" || httpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {Options});")); return; } if (httpMethodName == "post" || httpMethodName == "put" || httpMethodName == "patch") { if (RequestBodyCodeTypeReference == null) { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {Options});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {OptionsWithContent});")); } return; } } else { string returnTypeCast = returnTypeText == null ? String.Empty : $"<{returnTypeText}>"; if (httpMethodName == "get" || httpMethodName == "delete") { if (returnTypeText == null) { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {OptionsForResponse});")); //only http response needed } else { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {Options}).then(d => d.json());")); } } else if (httpMethodName == "post" || httpMethodName == "put" || httpMethodName == "patch") { if (returnTypeText == null) //http response { if (RequestBodyCodeTypeReference == null) //no content body { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {OptionsForResponse});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {ContentOptionsForResponse});")); } } else // type is returned { if (RequestBodyCodeTypeReference == null) // no body { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {Options}).then(d => d.json());")); } else { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {OptionsWithContent}).then(d => d.json());")); } } } else { Debug.Assert(false, $"How come with {httpMethodName}?"); } } }
protected override void RenderImplementation() { RenderMethodPrototype(); if (handleHttpRequestHeaders) { Method.Parameters.Add(new CodeParameterDeclarationExpression( "() => {[header: string]: string}", "headersHandler?")); } var jsUriQuery = UriQueryHelper.CreateUriQueryForTs(Description.RelativePath, Description.ParameterDescriptions); var hasArrayJoin = jsUriQuery != null && jsUriQuery.Contains(".join("); var uriText = jsUriQuery == null ? $"'{Description.RelativePath}'" : RemoveTrialEmptyString(hasArrayJoin ? $"'{jsUriQuery}" : $"'{jsUriQuery}'"); //Aurelia expect relative path. if (ReturnType != null && TypeHelper.IsStringType(ReturnType) && this.StringAsString) //stringAsString is for .NET Core Web API { if (HttpMethodName == "get" || HttpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}{OptionsForString}).then(d => d.text());")); //todo: type cast is not really needed. return; } if (HttpMethodName == "post" || HttpMethodName == "put" || HttpMethodName == "patch") { var dataToPost = GetDataToPost(); if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, null{OptionsForString}).then(d => d.text());")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, JSON.stringify({dataToPost}), {ContentOptionsForString}).then(d => d.text());")); } return; } } else if (returnTypeText == AureliatHttpBlobResponse) //translated from blobresponse to this { if (HttpMethodName == "get" || HttpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}{OptionsForString}).then(d => d.blob());")); //todo: type cast is not really needed. return; } if (HttpMethodName == "post" || HttpMethodName == "put" || HttpMethodName == "patch") { var dataToPost = GetDataToPost(); if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, null{OptionsForString}).then(d => d.blob());")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, JSON.stringify({dataToPost}), {ContentOptionsForString}).then(d => d.blob());")); } return; } } else if (returnTypeText == AureliaHttpStringResponse) //translated from response to this { if (HttpMethodName == "get" || HttpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}{OptionsForResponse}).then(d => d.json());")); return; } if (HttpMethodName == "post" || HttpMethodName == "put" || HttpMethodName == "patch") { var dataToPost = GetDataToPost(); if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, null{OptionsForResponse}).then(d => d.json());")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, JSON.stringify({dataToPost}), {ContentOptionsForResponse}).then(d => d.json());")); } return; } } else if (returnTypeText == AureliaHttpResponse) // client should care about only status { if (HttpMethodName == "get" || HttpMethodName == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}{Options});")); return; } if (HttpMethodName == "post" || HttpMethodName == "put" || HttpMethodName == "patch") { var dataToPost = GetDataToPost(); if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, null{Options});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, JSON.stringify({dataToPost}), {OptionsWithContent});")); } return; } } else { if (HttpMethodName == "get" || HttpMethodName == "delete") { if (returnTypeText == null) { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}{OptionsForResponse});")); //only http response needed } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}{Options}).then(d => d.json());")); } } else if (HttpMethodName == "post" || HttpMethodName == "put" || HttpMethodName == "patch") { var dataToPost = GetDataToPost(); if (returnTypeText == null) //http response { if (dataToPost == "null") //no content body { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, null{OptionsForResponse});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, JSON.stringify({dataToPost}), {ContentOptionsForResponse}).then(d => d.json());")); } } else // type is returned { if (dataToPost == "null") // no body { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, null{Options}).then(d => d.json());")); } else { Method.Statements.Add(new CodeSnippetStatement($"return this.http.{HttpMethodName}({uriText}, JSON.stringify({dataToPost}), {OptionsWithContent}).then(d => d.json());")); } } } else { Debug.Assert(false, $"How come with {HttpMethodName}?"); } } }
protected override void RenderImplementation() { var httpMethod = Description.HttpMethod.ToLower(); //Method is always uppercase. //deal with parameters var parameters = Description.ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression(Poco2TsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name) ).ToList(); Method.Parameters.AddRange(parameters.ToArray()); var jsUriQuery = UriQueryHelper.CreateUriQueryForTs(Description.RelativePath, Description.ParameterDescriptions); var hasArrayJoin = jsUriQuery != null && jsUriQuery.Contains(".join("); var uriText = jsUriQuery == null ? $"this.baseUri + '{Description.RelativePath}'" : RemoveTrialEmptyString(hasArrayJoin ? $"this.baseUri + '{jsUriQuery}" : $"this.baseUri + '{jsUriQuery}'"); if (ReturnType != null && TypeHelper.IsStringType(ReturnType) && this.StringAsString) //stringAsString is for .NET Core Web API { if (httpMethod == "get" || httpMethod == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}'}}).then(d => d.text());")); return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; if (String.IsNullOrEmpty(contentType)) { contentType = "application/json;charset=UTF-8"; } if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}', headers: {{ 'Content-Type': '{contentType}' }} }}).then(d => d.text());")); } else { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}', headers: {{ 'Content-Type': '{contentType}' }}, body: JSON.stringify({dataToPost}) }}).then(d => d.text());")); } return; } } else if (returnTypeText == AureliatHttpBlobResponse) //translated from blobresponse to this { if (httpMethod == "get" || httpMethod == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}'}}).then(d => d.blob());")); return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}'}}).then(d => d.blob());")); } else { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}', body: JSON.stringify({dataToPost})}}).then(d => d.blob());")); } return; } } else if (returnTypeText == AureliaHttpResponse) // client should care about only status { if (httpMethod == "get" || httpMethod == "delete") { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}'}});")); return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}'}});")); } else { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}', headers: {{ 'Content-Type': '{contentType}' }}, body: JSON.stringify({dataToPost}) }});")); } return; } } else { if (httpMethod == "get" || httpMethod == "delete") { if (hasArrayJoin) { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}'}}).then(d => d.json());")); } else { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}'}}).then(d => d.json());")); } return; } if (httpMethod == "post" || httpMethod == "put") { 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 InvalidOperationException(String.Format("This API function {0} has more than 1 FromBody bindings in parameters", Description.ActionDescriptor.ActionName)); } var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault(); var dataToPost = singleFromBodyParameterDescription == null ? "null" : singleFromBodyParameterDescription.ParameterDescriptor.ParameterName; if (String.IsNullOrEmpty(contentType)) { contentType = "application/json;charset=UTF-8"; } if (dataToPost == "null") { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}', headers: {{ 'Content-Type': '{contentType}' }} }}).then(d => d.json());")); } else { Method.Statements.Add(new CodeSnippetStatement($"return fetch({uriText}, {{method: '{httpMethod}', headers: {{ 'Content-Type': '{contentType}' }}, body: JSON.stringify({dataToPost}) }}).then(d => d.json());")); } return; } } Debug.Assert(false, "How come?"); }
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}")); } }