はじめに
この記事では、ASP.NET Core の Minimal API を使用して、簡潔で迅速に開発できる Web API の作成方法を紹介します。
4 年ほど前(2020 年ごろ)まで C# でバックエンド API の開発をしていた私ですが、下記の記事の執筆時に、そもそも Mock を使わずに動作するのかを検証しようとしました。
呼び出し先の API は慣れた言語で書きたいと思い、C# で記述することは決めていたものの、いつもの WeatherForecast を加工するのも手間だなと思っていたら、Minimal API という存在に気づきました。
手軽に始められるので、簡単な手順と共にご紹介します。
4 年前(2020 年ごろ)の私の知識
Visual Studio で 以前から知っている構成で ASP.NET Core Web API のプロジェクトを新規作成すると、下記のような Controller が生成されます。
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
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)]
})
.ToArray();
}
}
これはこれで、様々な C# のメリットを享受できる実装なのですが、縦にも横にも長いです。
動作検証用の API をサクっと作りたいときには冗長な感じがありますし、久しぶりに C# に触れた私は、API のパス指定方法を思い出せませんでした。
Minimal API を利用したコードの生成
Minimal API を利用する際は、ASP.NET Core Web API のプロジェクトの作成時、下記の赤枠の 2 つのチェックを外してください。
すると、とてもシンプルなコードが生成されます。
Controller に相当する部分は下記で、直感的で必要最低限の情報量になった印象です。
var summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
app.MapGet("/weatherforecast", () =>
{
var 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)]
))
.ToArray();
return forecast;
})
.WithName("GetWeatherForecast")
.WithOpenApi();
コードの各部位の役割が推測しやすいので、すぐに調整できそうです。
例えば記事執筆時に実装が必要となったコードは抜粋すると下記のようになり、非常に効率的に開発を進めることができました。
app.MapGet("/users/1", () =>
{
return new
{
id = 1,
name = "User A",
email = "a@example.com"
};
})
.WithName("GetUser")
.WithOpenApi();
※ WithName()
や WithOpenApi()
が無くても動きます
デバッグ実行すると、いつもの Swagger UI も立ち上がるので、動作確認もすぐできます。