ASP.NET Core Web APIを使ってみた

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();

AddDbContextTodoContextクラスをアプリに登録しています。

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の公式チュートリアルを参考に実装してみました。

スキャフォールディングは簡単にコントローラーが作成されますのでぜひ使ってみてください。

投稿者プロフィール

NakayamaYoshito

最近の記事

  1. raspberrypi

制作実績一覧

  1. Checkeys