Minimua APIプロジェクトを作成する
プロジェクトの作成
以下のコマンドでプロジェクトを作成します。ほぼコントローラベースのWeb APIと同様ですが、-minimalオプションを指定する点のみが異なります。
% dotnet new webapi -minimal -o MinimalApiSample --no-https -f net7.0
ビルドと実行
MinimulApiSampleプロジェクトをdotnet watchコマンドで実行すると、Swagger UIのページが表示されます(図1)。見ての通り、URLのパスなどが微妙に異なるだけで、前回のWebApiSampleの実行結果である図3とほとんど変わりません。
![図1:MinimalApiSampleのSwagger UIページ](http://cz-cdn.shoeisha.jp/static/images/article/17891/17891_01.png)
APIの呼び出しも同様の手順で実行できます。図2のように、同じレスポンスとなります。
![図2:Swagger UIによるAPIの呼び出し結果](http://cz-cdn.shoeisha.jp/static/images/article/17891/17891_02.png)
プロジェクトの構成とファイル
MinimalApiSampleプロジェクトは、主にPropertiesフォルダとProgram.csファイルから成るシンプルな構成です。Propertiesフォルダには、前回に紹介したコントローラベースのWeb API同様の目的のlaunchSettings.jsonファイルが置かれます。これを除けば、Minimalの名の通り、ほとんどがProgram.csファイルに集約されているといって良いでしょう。このファイルを見てみましょう。
// ビルダーオブジェクトの生成とSwaggerジェネレータの追加 var builder = WebApplication.CreateBuilder(args); (1) builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // アプリケーションオブジェクトの生成と開発時のみSwaggerサポートを使用 var app = builder.Build(); (2) if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } // 気象情報の概要データ var summaries = new[] (3) { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; // URLパス/weatherforecastに対応するメソッドを登録 app.MapGet("/weatherforecast", () => (4) { var forecast = Enumerable.Range(1, 5).Select(index => (5) new WeatherForecast ( DateTime.Now.AddDays(index), Random.Shared.Next(-20, 55), summaries[Random.Shared.Next(summaries.Length)] )) .ToArray(); return forecast; }) .WithName("GetWeatherForecast"); // OASのoperationIdにひも付け // アプリケーションの起動 app.Run(); (6) // データ受け渡しのためのレコード型を定義 record WeatherForecast(DateTime Date, int TemperatureC, string? Summary) (7) { public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); }
(1)からは、ビルダーオブジェクトの生成と、サービスコレクションへのSwaggerジェネレータの追加を行っています。Swaggerジェネレータについては前回と同様ですが、Minimal APIではコントローラがないのでその利用についての追加がありません。
(2)からは、アプリケーションオブジェクトの生成と、DebugターゲットでのみSwaggerを有効にする設定を行っています。コントローラベースのWeb APIと同様です。
(3)では、気象情報の概要(Summary)が静的な配列として作成されます。
(4)は、エンドポイントが「/weatherforecast」である場合のメソッドの定義です。Minimal APIでは、ルーティングはこのようにMapGetメソッドによって指定していきます。これは、多くのマイクロフレームワークで採用されているパターンと同じです。最後にWithNameメソッドを呼んでいるのは、エンドポイントと引数"GetWeatherForecast"をOASのoperationId要素としてひも付けるためです。コントローラベースのWeb APIでは、属性によってひも付けていました。
(5)と(6)については、基本はコントローラベースのWeb APIと同様です。異なるのは、MapGetメソッドでURLパスとともに処理内容を引数の関数に記述している点です。
(7)は、(5)で生成しているWeatherForecastをレコード型として定義しています。レコード型はC# 9からサポートされた新しい型で、データの受け渡しを主な目的としています。
コントローラベースのWeb APIで見てきたようなファイルごとの役割分担はなく、アプリケーションの起動ロジック、ルーティングとメソッドの定義、モデルの定義などが全てProgram.csファイルに集約されています。RESTfulなAPIである必要はない、とにかくリクエストに対して何かレスポンスを返せればいい、という場合には有用な選択肢でしょう。ただし、Webサービスとしての規模が大きくなってくると、全体の見通しが悪くなってきますから、その場合にはコントローラベースのWeb APIの利用を検討しましょう。