Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ASP. NET CoreにおけるWebAPIの最新情報

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for tomokusaba tomokusaba
January 24, 2025

ASP. NET CoreにおけるWebAPIの最新情報

ASP. NET CoreにおけるWebAPIの最新情報
.NETラボ 勉強会 2025年1月
https://dotnetlab.connpass.com/event/341044/

Avatar for tomokusaba

tomokusaba

January 24, 2025
Tweet

More Decks by tomokusaba

Other Decks in Programming

Transcript

  1. 今日の目的 • ASP.NET CoreではWeb APIを実装する方法が2通りありま す。 • さらに、.NET 9においてOpen APIのドキュメント生成に関して

    のサポートがされました。 • 近年のWebアプリケーションにおいてWeb APIの実装は重要さ をますます増しています。 • そこで一通りのおさらいをしていきたいと思います。
  2. コントローラーベースのWebAPI • Program.cs var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddOpenApi(); var

    app = builder.Build(); if (app.Environment.IsDevelopment()) { app.MapOpenApi(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); .net/MuseWiki/
  3. コントローラーベースのWebAPI • WeatherForecastController.cs [ApiController] [Route("[controller]")] public class WeatherForecastController(ILogger<WeatherForecastController> logger) :

    ControllerBase { private static readonly string[] Summaries = [ "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" ]; private readonly ILogger<WeatherForecastController> _logger = logger; [HttpGet(Name = "GetWeatherForecast")] public IEnumerable<WeatherForecast> Get() { _logger.LogInformation("Getting weather forecast"); return [.. Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] })]; } }
  4. Minimal API var builder = WebApplication.CreateBuilder(args); // Add services to

    the container. // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi builder.Services.AddOpenApi(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.MapOpenApi(); } app.UseHttpsRedirection(); string[] summaries = [ "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" ]; app.MapGet("/weatherforecast", () => { WeatherForecast[] forecast = [.. Enumerable.Range(1, 5).Select(index => new WeatherForecast ( DateOnly.FromDateTime(DateTime.Now.AddDays(index)), Random.Shared.Next(-20, 55), summaries[Random.Shared.Next(summaries.Length)] ))]; return TypedResults.Ok<WeatherForecast[]>(forecast); }) .WithName("GetWeatherForecast"); app.Run(); internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) { public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); } • Program.cs
  5. 同時実行速度はMinimal APIのほうが優位 Average Median Throuhtput Received KB/sec コントローラベース 108 41

    4422.2/sec 2361.33 Minimal API 59 16 4773.3/sec 2549.01 Minimal APIの方が多くのリクエストを捌ける印象あり
  6. Program.csにすべて書きがち問題 • Minimal APIはProgram.csに配置する必要はありません。 using MinAPISeparateFile; var builder = WebApplication.CreateSlimBuilder(args);

    var app = builder.Build(); TodoEndpoints.Map(app); app.Run(); using Logic; using Model; namespace MinAPISeparateFile; public static class TodoEndpoints { public static void Map(WebApplication app) { app.MapGet("/todos", () => { var todos = new[] { new Todo { Id = 1, Title = "Do something" }, new Todo { Id = 2, Title = "Do something 2" } }; return Results.Ok(todos); }); app.MapGet("/todos/{id}",(int id) => { var todo = new Todo { Id = id, Title = $"Do something{id}" }; return Results.Ok(todo); }); } } ここを増やせばよい 実装側
  7. MapGet以下にすべてを書きがち問題 • MapGet以下に実装を書く必要はありません namespace MinAPISeparateFile; public static class TodoEndpoints {

    public static void Map(WebApplication app) { app.MapGet("/todos", TodoLogic.GetTodos); app.MapGet("/todos/{id}", TodoLogic.GetTodoById); } } using Model; using Microsoft.AspNetCore.Http.HttpResults; namespace Logic; public static class TodoLogic { public static Ok<Todo[]> GetTodos() { var todos = new[] { new Todo { Id = 1, Title = "Do something" }, new Todo { Id = 2, Title = "Do something else" } }; return TypedResults.Ok(todos); } public static Ok<Todo> GetTodoById(int id) { var todo = new Todo { Id = id, Title = "Do something" }; return TypedResults.Ok(todo); } }
  8. Open APIについて • HTTP APIをドキュメント化するためのプログラミング言語に依 存しない標準 • 次の3つの重要な側面がある • アプリ内のエンドポイントに関する情報を生成

    • OpenAPIスキーマーに一致する形式で情報を収集 • 生成されたOpenAPIドキュメントをUIまたはシリアル化されたファイル を通じて公開する
  9. Microsoft.AspNetCore.OpenApi • .NET 9以降OpenAPIドキュメント生成はこちらが標準 • Swagger UIは提供されていない • Swagger UIを使用したい場合は従来のSwashbuckleを組み

    合わせて使うこともできる app.UseSwaggerUI(o => o.SwaggerEndpoint("/openapi/v1.json", "v1")); • お勧めはScalar.AspNetCore app.MapScalarApiReference();
  10. 参考文献 • ASP.NET Core を使って Web API を作成する https://learn.microsoft.com/ja- jp/aspnet/core/web-api/?view=aspnetcore-9.0

    • ASP.NET Core API アプリでの OpenAPI のサポート https://learn.microsoft.com/ja- jp/aspnet/core/fundamentals/openapi/overview?v iew=aspnetcore-9.0