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. ///