Web API 開発(ASP.NET Core 5.0)

Web API の開発環境を作成する。
(参考)チュートリアル: ASP.NET Core で Web API を作成する(ASP.NET Core 5.0)

スポンサーリンク

前提環境

Visual Studio2019
Windows10

開発

プロジェクト作成

プロジェクトの新規作成で「ASP.Net Core Web API」を選択。

モデル作成

プロジェクトに「Models」フォルダを作成し、クラスを作成。

namespace WebApplication2.Models
{
    public class TodoItem
    {
        public long Id { get; set; }
        public string? Name { get; set; }
        public bool IsComplete { get; set; }
    }
}

データベースコンテキスト作成

NuGetで「Microsoft.EntityFrameworkCore.InMemory」をインストールする。プロジェクト作成時「.Net5.0」を選択していたので、バージョン5.0.14を指定。

「Models」フォルダにクラスを追加。

using Microsoft.EntityFrameworkCore;

namespace WebApplication2.Models
{
    public class TodoContext : DbContext
    {
          public TodoContext(DbContextOptions<TodoContext> options)
            : base(options)
        {
        }

        public DbSet<TodoItem> TodoItems { get; set; }
    }
}

データベースコンテキスト登録

Startup.cs に登録処理を追加する。(依存関係の挿入:DI)

using Microsoft.EntityFrameworkCore; // 追加
using WebApplication2.Models; // 追加
   ・・・
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase("TodoList")); // 追加
        }
   ・・・
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
                endpoints.MapControllers();  // 追加
            });

コントローラ作成

「Controllers」フォルダを作成し、新規スキャフォールディングの追加から、APIコントローラを作成すると、DBへCRUDするコードが自動で作成される。

下記エラーが発生したので、NuGetでそのパッケージをアンインストール→インストールしたら解消した。

自動作成されたコードがWeb API になる。
詳しい説明は以下。
ASP.NET Core を使って Web API を作成する
Http[Verb] 属性を使用する属性ルーティング

namespace WebApplication2.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);
            return CreatedAtAction(nameof(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);
        }
    }
}

75行目はハードコーディングになっているので、nameof(GetTodoItem) に修正。

実行

プロジェクトを選択してデバッグ実行。コマンドプロンプトとブラウザが起動する。

「Get」メソッドは、「https://localhost:5001/api/todoitems」にアクセスすると結果が表示される。
「Post」メソッドは、PostmanやSwaggeで確認できる。

Swaggerインストール

Swaggerを入れれば動作確認がしやすくなる。

コメント

タイトルとURLをコピーしました