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とほとんど変わりません。
APIの呼び出しも同様の手順で実行できます。図2のように、同じレスポンスとなります。
プロジェクトの構成とファイル
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の利用を検討しましょう。
