SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

.NET最新版でASP.NET Core

ASP.NET Coreの軽量Web APIフレームワーク「Minimal API」を使ったSPA開発

.NET最新版でASP.NET Core 第9回

  • X ポスト
  • このエントリーをはてなブックマークに追加

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ページ
図1:MinimalApiSampleのSwagger UIページ

 APIの呼び出しも同様の手順で実行できます。図2のように、同じレスポンスとなります。

図2:Swagger UIによるAPIの呼び出し結果
図2:Swagger UIによるAPIの呼び出し結果

プロジェクトの構成とファイル

 MinimalApiSampleプロジェクトは、主にPropertiesフォルダとProgram.csファイルから成るシンプルな構成です。Propertiesフォルダには、前回に紹介したコントローラベースのWeb API同様の目的のlaunchSettings.jsonファイルが置かれます。これを除けば、Minimalの名の通り、ほとんどがProgram.csファイルに集約されているといって良いでしょう。このファイルを見てみましょう。

リスト 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の利用を検討しましょう。

次のページ
SPAテンプレートを利用する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
.NET最新版でASP.NET Core連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook <個人紹介> WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/17891 2023/07/10 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング