From b1e98b22557171b9c554ee527ba0669153f40e8f Mon Sep 17 00:00:00 2001 From: Samson Amaugo Date: Fri, 15 Jul 2022 03:19:44 +0100 Subject: [PATCH 01/13] created project --- .../typedResults/TypedResultsApiWithTest/Program.cs | 6 ++++++ .../TypedResultsApiWithTest.csproj | 9 +++++++++ .../TypedResultsApiWithTest/appsettings.Development.json | 8 ++++++++ .../TypedResultsApiWithTest/appsettings.json | 9 +++++++++ 4 files changed, 32 insertions(+) create mode 100644 aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs create mode 100644 aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/TypedResultsApiWithTest.csproj create mode 100644 aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/appsettings.Development.json create mode 100644 aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/appsettings.json diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs new file mode 100644 index 000000000000..1760df1d28be --- /dev/null +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs @@ -0,0 +1,6 @@ +var builder = WebApplication.CreateBuilder(args); +var app = builder.Build(); + +app.MapGet("/", () => "Hello World!"); + +app.Run(); diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/TypedResultsApiWithTest.csproj b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/TypedResultsApiWithTest.csproj new file mode 100644 index 000000000000..4c2bb77d0106 --- /dev/null +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/TypedResultsApiWithTest.csproj @@ -0,0 +1,9 @@ + + + + net7.0 + enable + enable + + + diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/appsettings.Development.json b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/appsettings.Development.json new file mode 100644 index 000000000000..0c208ae9181e --- /dev/null +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/appsettings.json b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/appsettings.json new file mode 100644 index 000000000000..10f68b8c8b4f --- /dev/null +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} From ca0e98608a8d9ae2f495db45a90b5af571769a61 Mon Sep 17 00:00:00 2001 From: Samson Amaugo Date: Fri, 15 Jul 2022 03:21:37 +0100 Subject: [PATCH 02/13] added required test nugets --- .../TypedResultsApiWithTest/TypedResultsApiWithTest.csproj | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/TypedResultsApiWithTest.csproj b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/TypedResultsApiWithTest.csproj index 4c2bb77d0106..32b3eb29c7a2 100644 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/TypedResultsApiWithTest.csproj +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/TypedResultsApiWithTest.csproj @@ -6,4 +6,11 @@ enable + + + + + + + From 765089187171b9a2974e3c455b8df04f340a4ee8 Mon Sep 17 00:00:00 2001 From: Samson Amaugo Date: Fri, 15 Jul 2022 03:22:24 +0100 Subject: [PATCH 03/13] added custom controller --- .../TypedResultsApiWithTest/Program.cs | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs index 1760df1d28be..8a02a3769751 100644 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs @@ -2,5 +2,41 @@ var app = builder.Build(); app.MapGet("/", () => "Hello World!"); - +// map the /weatherforecast endpoint to a custom action +app.MapWeatherApi(); app.Run(); + + + +public static class WeatherApi +{ + public static string[] summaries = +{ + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" +}; + + public static WebApplication MapWeatherApi(this WebApplication routes) + { + routes.MapGet("/weatherforecast", GetAllWeathers); + + return routes; + } + public static IResult GetAllWeathers() + { + var forecast = Enumerable.Range(1, 5).Select(index => + new WeatherForecast + ( + DateTime.Now.AddDays(index), + Random.Shared.Next(-20, 55), + summaries[Random.Shared.Next(summaries.Length)] + )) + .ToArray(); + // return a typed result + return TypedResults.Ok(forecast); ; + } +} + +public record WeatherForecast(DateTime Date, int TemperatureC, string? Summary) +{ + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); +} From d7a946cb52b2a3f23089ebc1d07725be8725c149 Mon Sep 17 00:00:00 2001 From: Samson Amaugo Date: Fri, 15 Jul 2022 03:23:37 +0100 Subject: [PATCH 04/13] created test file --- .../typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs new file mode 100644 index 000000000000..e69de29bb2d1 From d588ce0d74c935201334165008df05c9b7da7cef Mon Sep 17 00:00:00 2001 From: Samson Amaugo Date: Fri, 15 Jul 2022 03:24:52 +0100 Subject: [PATCH 05/13] added comments --- .../Test/WeatherApiTest.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs index e69de29bb2d1..e35f43824b4e 100644 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs @@ -0,0 +1,19 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.AspNetCore.Http.HttpResults; + +namespace Tests +{ + [TestClass()] + public class WeatherApiTests + { + [TestMethod()] + public void MapWeatherApiTest() + { + var result = WeatherApi.GetAllWeathers(); + // assert that the result is a typed result of type WeatherForecast[] + Assert.IsInstanceOfType(result, typeof(Ok)); + } + + } + +} \ No newline at end of file From 96b01ede78b6e0de10a1cf843954a415c62449d2 Mon Sep 17 00:00:00 2001 From: sammychinedu2ky Date: Sat, 16 Jul 2022 06:02:56 +0100 Subject: [PATCH 06/13] add new line Co-authored-by: Rick Anderson <3605364+Rick-Anderson@users.noreply.github.com> --- .../typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs index e35f43824b4e..24994ae3f959 100644 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs @@ -16,4 +16,4 @@ public void MapWeatherApiTest() } -} \ No newline at end of file +} From 301c1ea62ead9ed1dbd05d8e82a5369690d8f608 Mon Sep 17 00:00:00 2001 From: sammychinedu2ky Date: Sat, 16 Jul 2022 06:03:27 +0100 Subject: [PATCH 07/13] remove a line Co-authored-by: Rick Anderson <3605364+Rick-Anderson@users.noreply.github.com> --- .../misc-samples/typedResults/TypedResultsApiWithTest/Program.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs index 8a02a3769751..b866e53e53f3 100644 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs @@ -31,7 +31,6 @@ public static IResult GetAllWeathers() summaries[Random.Shared.Next(summaries.Length)] )) .ToArray(); - // return a typed result return TypedResults.Ok(forecast); ; } } From 2b67822aabac19f9d106fc2dec0cfb0a9b0744b7 Mon Sep 17 00:00:00 2001 From: sammychinedu2ky Date: Sat, 16 Jul 2022 06:03:44 +0100 Subject: [PATCH 08/13] remove line Co-authored-by: Rick Anderson <3605364+Rick-Anderson@users.noreply.github.com> --- .../typedResults/TypedResultsApiWithTest/Program.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs index b866e53e53f3..c1c7edbd6be2 100644 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs @@ -6,8 +6,6 @@ app.MapWeatherApi(); app.Run(); - - public static class WeatherApi { public static string[] summaries = From 8d990a56e6da471d2a0ac6683d131e60a292a677 Mon Sep 17 00:00:00 2001 From: sammychinedu2ky Date: Sat, 16 Jul 2022 06:04:02 +0100 Subject: [PATCH 09/13] removed comment Co-authored-by: Rick Anderson <3605364+Rick-Anderson@users.noreply.github.com> --- .../typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs index 24994ae3f959..549a5a44fe91 100644 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs @@ -10,7 +10,6 @@ public class WeatherApiTests public void MapWeatherApiTest() { var result = WeatherApi.GetAllWeathers(); - // assert that the result is a typed result of type WeatherForecast[] Assert.IsInstanceOfType(result, typeof(Ok)); } From 4035ba6142906d328a7df8f8f1a84331377525bb Mon Sep 17 00:00:00 2001 From: Rick Anderson <3605364+Rick-Anderson@users.noreply.github.com> Date: Mon, 18 Jul 2022 17:08:36 -1000 Subject: [PATCH 10/13] Minimal api typedresults sample --- .../typedResults/TypedResultsApiWithTest/Program.cs | 4 ++-- .../TypedResultsApiWithTest/Test/WeatherApiTest.cs | 3 ++- .../minimal-apis/misc-samples/typedResults/readme.txt | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/readme.txt diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs index c1c7edbd6be2..62ebfae0c998 100644 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Program.cs @@ -1,8 +1,8 @@ var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); -app.MapGet("/", () => "Hello World!"); -// map the /weatherforecast endpoint to a custom action +app.MapGet("/", () => "Try /weatherforecast"); +// Map the /weatherforecast endpoint to a custom action. app.MapWeatherApi(); app.Run(); diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs index 549a5a44fe91..5dc411acb10c 100644 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs @@ -3,6 +3,7 @@ namespace Tests { + // [TestClass()] public class WeatherApiTests { @@ -14,5 +15,5 @@ public void MapWeatherApiTest() } } - + // } diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/readme.txt b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/readme.txt deleted file mode 100644 index 655bdceab454..000000000000 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/readme.txt +++ /dev/null @@ -1 +0,0 @@ -Create sample code here then delete this file. \ No newline at end of file From 250c9d5fbb5769f2c6b54b259f613c49d3984e28 Mon Sep 17 00:00:00 2001 From: Rick Anderson <3605364+Rick-Anderson@users.noreply.github.com> Date: Tue, 19 Jul 2022 12:26:02 -1000 Subject: [PATCH 11/13] Minimal api typedresults sample --- aspnetcore/fundamentals/minimal-apis.md | 10 ++++++---- .../TypedResultsApiWithTest/Test/WeatherApiTest.cs | 3 +-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/aspnetcore/fundamentals/minimal-apis.md b/aspnetcore/fundamentals/minimal-apis.md index b244663e4fb7..681021f2ef25 100644 --- a/aspnetcore/fundamentals/minimal-apis.md +++ b/aspnetcore/fundamentals/minimal-apis.md @@ -799,11 +799,13 @@ The following code uses an [OpenAPI grouping tag](https://swagger.io/docs/specif [!code-csharp[](minimal-apis/samples/todo/Program.cs?name=snippet_grp)] - +The interface can represent values returned from minimal APIs that don’t utilize the implicit support for JSON serializing the returned object to the HTTP response. The static [Results](/dotnet/api/microsoft.aspnetcore.http.results) class is used to create varying `IResult` objects that represent different types of responses. For example, setting the response status code or redirecting to another URL. + +The types implementing `IResult` are public, allowing for type assertions when testing. For example: + +[!code-csharp[](~/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs)] :::moniker-end diff --git a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs index 5dc411acb10c..b5335d68ff27 100644 --- a/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs +++ b/aspnetcore/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs @@ -12,8 +12,7 @@ public void MapWeatherApiTest() { var result = WeatherApi.GetAllWeathers(); Assert.IsInstanceOfType(result, typeof(Ok)); - } - + } } // } From 7805c0adb1984cc630f8b45ba94f660852155030 Mon Sep 17 00:00:00 2001 From: Rick Anderson <3605364+Rick-Anderson@users.noreply.github.com> Date: Tue, 19 Jul 2022 12:55:45 -1000 Subject: [PATCH 12/13] Minimal api typedresults sample --- aspnetcore/fundamentals/minimal-apis.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/aspnetcore/fundamentals/minimal-apis.md b/aspnetcore/fundamentals/minimal-apis.md index 681021f2ef25..6c1945f27f75 100644 --- a/aspnetcore/fundamentals/minimal-apis.md +++ b/aspnetcore/fundamentals/minimal-apis.md @@ -799,14 +799,6 @@ The following code uses an [OpenAPI grouping tag](https://swagger.io/docs/specif [!code-csharp[](minimal-apis/samples/todo/Program.cs?name=snippet_grp)] -## Typed results - -The interface can represent values returned from minimal APIs that don’t utilize the implicit support for JSON serializing the returned object to the HTTP response. The static [Results](/dotnet/api/microsoft.aspnetcore.http.results) class is used to create varying `IResult` objects that represent different types of responses. For example, setting the response status code or redirecting to another URL. - -The types implementing `IResult` are public, allowing for type assertions when testing. For example: - -[!code-csharp[](~/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs)] - :::moniker-end :::moniker range=">= aspnetcore-7.0" @@ -1620,6 +1612,14 @@ For more information, see +## Typed results + +The interface can represent values returned from minimal APIs that don’t utilize the implicit support for JSON serializing the returned object to the HTTP response. The static [Results](/dotnet/api/microsoft.aspnetcore.http.results) class is used to create varying `IResult` objects that represent different types of responses. For example, setting the response status code or redirecting to another URL. + +The types implementing `IResult` are public, allowing for type assertions when testing. For example: + +[!code-csharp[](~/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs)] + ## OpenAPI An app can describe the [OpenAPI specification](https://swagger.io/specification/) for route handlers using [Swashbuckle](https://www.nuget.org/packages/Swashbuckle.AspNetCore/). The OpenAPI specification defines a standard for documenting RESTful APIs so that end users and other services can examine the capabilities of an API service. From 1c2b0905eda6855c7bd5cb9a9065dab799011c04 Mon Sep 17 00:00:00 2001 From: Rick Anderson <3605364+Rick-Anderson@users.noreply.github.com> Date: Tue, 19 Jul 2022 13:00:28 -1000 Subject: [PATCH 13/13] Minimal api typedresults sample --- aspnetcore/fundamentals/minimal-apis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aspnetcore/fundamentals/minimal-apis.md b/aspnetcore/fundamentals/minimal-apis.md index 6c1945f27f75..a8cdb439101c 100644 --- a/aspnetcore/fundamentals/minimal-apis.md +++ b/aspnetcore/fundamentals/minimal-apis.md @@ -1618,7 +1618,7 @@ The interface can represent values retu The types implementing `IResult` are public, allowing for type assertions when testing. For example: -[!code-csharp[](~/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs)] +[!code-csharp[](~/fundamentals/minimal-apis/misc-samples/typedResults/TypedResultsApiWithTest/Test/WeatherApiTest.cs?name=snippet_1&highlight=7-8)] ## OpenAPI