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

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

tomokusaba
January 24, 2025

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

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

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