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を入れれば動作確認がしやすくなる。

コメント