1.はじめに
ASP.NET Core Web APIの公式チュートリアルを参考に実装してみました。
チュートリアル: ASP.NET Core で Web API を作成する
2.環境
- Windows 11
- Visual Studio 2022
- .NET 8
3.プロジェクトの作成(ASP.NET Core Web API)
「ASP.NET Core Web API」テンプレートを選択します。
プロジェクト名はチュートリアルと同じ「TodoApi」にします。
フレームワークには「.NET 8.0(長期的なサポート)」を選択します。
プロジェクトが作成できたら、「Ctrl + F5」で実行します。
ブラウザが起動し、以下のようなSwagger UIのページが表示されます。
デフォルトでは、WeatherForecast(天気予報)をGETするAPIが作成されます。
「Execute」をクリックして、リクエストを投げます。
Response Bodyに日時や気温が返されます。
4.モデルクラスとDBContextの追加
アプリが管理するデータを表すクラスのモデルを作成します。
新規で「Models」のフォルダを作成、その配下に「TodoItem.cs」を作成します。
以下のようにコードを記述します。
namespace TodoApi.Models
{
public class TodoItem
{
public long Id { get; set; } //テーブルの主キー
public string? Name { get; set; } //タスク名
public bool IsComplete { get; set; } //タスクの完了フラグ
}
}
モデルクラスとDBを対応付けるためのDbContextクラスを作成します。
「Microsoft.EntityFrameworkCore.InMemory」のパッケージをインストールします。
実際のデータベースを使用せずにメモリ上にデータベースを作成し、データの読み書きができるようになります。
次に、Models フォルダ内にTodoContext.cs
というクラスを追加して、以下のコードを記述します。
これは、TodoItem
というデータをデータベースに保存したり、取り出したりできる橋渡しの役割があります。
using Microsoft.EntityFrameworkCore;
namespace TodoApi.Models;
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options)
: base(options)
{
}
public DbSet<TodoItem> TodoItems { get; set; } = null!;
}
作成したTodoContextをアプリに登録するために、Program.csを変更します。
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
AddDbContext
でTodoContext
クラスをアプリに登録しています。
5.コントローラーのスキャフォールディング
スキャフォールディングを実行すると、各CRUDメソッドが実装されたコントローラーを自動で生成することができます。
Controllers
フォルダを右クリックして、「追加」→「新規スキャフォールディングアイテム」をクリックします。
「Entity Framework を使用したアクションがある API コントローラー」を選択します。
モデルクラスに先ほど作成したTodoItem
を、DbContextクラスにTodoContext
を選択して「追加」をクリックすると、スキャフォールディングが開始されます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;
namespace TodoApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class TodoItemsController : ControllerBase
{
private readonly TodoContext _context;
public TodoItemsController(TodoContext context)
{
_context = context;
}
// GET: api/TodoItems
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
{
return await _context.TodoItems.ToListAsync();
}
// GET: api/TodoItems/5
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
return todoItem;
}
// PUT: api/TodoItems/5
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(long id, TodoItem todoItem)
{
if (id != todoItem.Id)
{
return BadRequest();
}
_context.Entry(todoItem).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!TodoItemExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
// POST: api/TodoItems
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost]
public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem todoItem)
{
_context.TodoItems.Add(todoItem);
await _context.SaveChangesAsync();
return CreatedAtAction("GetTodoItem", new { id = todoItem.Id }, todoItem);
}
// DELETE: api/TodoItems/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
_context.TodoItems.Remove(todoItem);
await _context.SaveChangesAsync();
return NoContent();
}
private bool TodoItemExists(long id)
{
return _context.TodoItems.Any(e => e.Id == id);
}
}
}
スキャフォールディングで実行した各CRUDメソッドが実装されたコントローラーが作成されています。
4.おわりに
今回は、ASP.NET Core Web APIの公式チュートリアルを参考に実装してみました。
スキャフォールディングは簡単にコントローラーが作成されますのでぜひ使ってみてください。