From ed1d10ba9d8ff8e7cec1ab8090b0aea610b694c9 Mon Sep 17 00:00:00 2001 From: MattMo Date: Mon, 6 Feb 2023 09:01:06 -0800 Subject: [PATCH] Added Json flag to RouteRequest and RouteResponse to control whether or not the content is Json and needs to be handled. Updated example code. Renamed ClientCodeGenerator to RestClientGenerator. Bumped package version to 1.2.2. --- Rest.Net.Example/Client.cs | 2 +- Rest.Net.Example/Program.cs | 6 +- Rest.Net/Rest.Net.csproj | 2 +- ...odeGenerator.cs => RestClientGenerator.cs} | 84 ++++++++++++++++++- Rest.Net/RouteListener.cs | 2 +- Rest.Net/RouteRequest.cs | 5 ++ Rest.Net/RouteResponse.cs | 5 ++ 7 files changed, 97 insertions(+), 9 deletions(-) rename Rest.Net/{ClientCodeGenerator.cs => RestClientGenerator.cs} (84%) diff --git a/Rest.Net.Example/Client.cs b/Rest.Net.Example/Client.cs index 4307c2e..485e840 100644 --- a/Rest.Net.Example/Client.cs +++ b/Rest.Net.Example/Client.cs @@ -81,7 +81,7 @@ namespace MontoyaTech.Rest.Net.Example var response = this.Client.HttpClient.Send(message); if (response.StatusCode == System.Net.HttpStatusCode.OK) - return JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().GetAwaiter().GetResult()); + return bool.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult()); else throw new Exception("Unexpected Http Response StatusCode:" + response.StatusCode); } diff --git a/Rest.Net.Example/Program.cs b/Rest.Net.Example/Program.cs index a4e6d87..0b327b5 100644 --- a/Rest.Net.Example/Program.cs +++ b/Rest.Net.Example/Program.cs @@ -37,7 +37,7 @@ namespace MontoyaTech.Rest.Net.Example new Route(HttpRequestMethod.Get, "/auth/", Json) ); - string code = ClientCodeGenerator.GenerateCSharpClient(listener.Routes); + string code = RestClientGenerator.GenerateCSharpClient(listener.Routes); Console.WriteLine(code); @@ -91,12 +91,12 @@ namespace MontoyaTech.Rest.Net.Example [RouteGroup("Auth")] [RouteName("UserExists")] - [RouteResponse(typeof(bool))] + [RouteResponse(typeof(bool), Json = false)] public static HttpListenerResponse Exists(HttpListenerContext context, string name) { Console.WriteLine("Auth.Exists called, name:" + name); - return context.Response.WithStatus(HttpStatusCode.OK).WithJson(true); + return context.Response.WithStatus(HttpStatusCode.OK).WithText("true"); } [RouteGroup("Auth")] diff --git a/Rest.Net/Rest.Net.csproj b/Rest.Net/Rest.Net.csproj index c02bef2..9c2df86 100644 --- a/Rest.Net/Rest.Net.csproj +++ b/Rest.Net/Rest.Net.csproj @@ -17,7 +17,7 @@ MontoyaTech.Rest.Net MontoyaTech.Rest.Net True - 1.2.1 + 1.2.2 Logo_Symbol_Black_Outline.png diff --git a/Rest.Net/ClientCodeGenerator.cs b/Rest.Net/RestClientGenerator.cs similarity index 84% rename from Rest.Net/ClientCodeGenerator.cs rename to Rest.Net/RestClientGenerator.cs index c12ecb1..d05ddbf 100644 --- a/Rest.Net/ClientCodeGenerator.cs +++ b/Rest.Net/RestClientGenerator.cs @@ -15,7 +15,7 @@ namespace MontoyaTech.Rest.Net /// A class that can take a set of routes and generate code /// for a client that can be used to interact with them. /// - public class ClientCodeGenerator + public class RestClientGenerator { /// /// Returns whether or not a given type belongs to DotNet. @@ -600,7 +600,12 @@ namespace MontoyaTech.Rest.Net //Add the request content if any. if (routeRequest != null) - writer.WriteBreak().WriteLine("message.Content = new StringContent(JsonConvert.SerializeObject(request));"); + { + if (routeRequest.Json) + writer.WriteBreak().WriteLine("message.Content = new StringContent(JsonConvert.SerializeObject(request));"); + else + writer.WriteBreak().WriteLine("message.Content = new StringContent(request.ToString());"); + } //Generate the response code writer.WriteBreak().WriteLine("var response = this.Client.HttpClient.Send(message);"); @@ -609,7 +614,80 @@ namespace MontoyaTech.Rest.Net if (routeResponse != null) { writer.WriteBreak().WriteLine("if (response.StatusCode == System.Net.HttpStatusCode.OK)").Indent(); - writer.WriteLine($"return JsonConvert.DeserializeObject<{GetTypeFullyResolvedName(routeResponse.ResponseType)}>(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + + if (routeResponse.Json) + { + writer.WriteLine($"return JsonConvert.DeserializeObject<{GetTypeFullyResolvedName(routeResponse.ResponseType)}>(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + } + else + { + switch (Type.GetTypeCode(routeResponse.ResponseType)) + { + case TypeCode.Boolean: + writer.WriteLine("return bool.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.Byte: + writer.WriteLine("return byte.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.Char: + writer.WriteLine("return response.Content.ReadAsStringAsync().GetAwaiter().GetResult()[0];"); + break; + + case TypeCode.DateTime: + writer.WriteLine("return DateTime.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.Decimal: + writer.WriteLine("return decimal.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.Double: + writer.WriteLine("return double.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.Int16: + writer.WriteLine("return short.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.Int32: + writer.WriteLine("return int.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.Int64: + writer.WriteLine("return long.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.SByte: + writer.WriteLine("return sbyte.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.Single: + writer.WriteLine("return float.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.String: + writer.WriteLine("return response.Content.ReadAsStringAsync().GetAwaiter().GetResult();"); + break; + + case TypeCode.UInt16: + writer.WriteLine("return ushort.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.UInt32: + writer.WriteLine("return uint.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.UInt64: + writer.WriteLine("return ulong.Parse(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());"); + break; + + case TypeCode.Object: + throw new NotSupportedException("ResponseType isn't JSON but is an object."); + } + } + writer.Outdent().WriteLine("else").Indent(); writer.WriteLine(@"throw new Exception(""Unexpected Http Response StatusCode:"" + response.StatusCode);").Outdent(); } diff --git a/Rest.Net/RouteListener.cs b/Rest.Net/RouteListener.cs index 67dd520..8e47df0 100644 --- a/Rest.Net/RouteListener.cs +++ b/Rest.Net/RouteListener.cs @@ -227,7 +227,7 @@ namespace MontoyaTech.Rest.Net /// public string GenerateCSharpClient(string name = "Client") { - return ClientCodeGenerator.GenerateCSharpClient(this, name); + return RestClientGenerator.GenerateCSharpClient(this, name); } } } diff --git a/Rest.Net/RouteRequest.cs b/Rest.Net/RouteRequest.cs index 4ab72e0..65f6dc9 100644 --- a/Rest.Net/RouteRequest.cs +++ b/Rest.Net/RouteRequest.cs @@ -17,6 +17,11 @@ namespace MontoyaTech.Rest.Net /// public Type RequestType = null; + /// + /// Whether or not the Request is Json Serialized. Default is true. + /// + public bool Json = true; + /// /// Creates a default route request. /// diff --git a/Rest.Net/RouteResponse.cs b/Rest.Net/RouteResponse.cs index 525fc04..11077c6 100644 --- a/Rest.Net/RouteResponse.cs +++ b/Rest.Net/RouteResponse.cs @@ -17,6 +17,11 @@ namespace MontoyaTech.Rest.Net /// public Type ResponseType = null; + /// + /// Whether or not the response is Json Serialized, default is true. + /// + public bool Json = true; + /// /// Creates a default route response. ///