ASP.NET Core ControllerでGETとPOSTのAPIを作成する
ASP.NET CoreのControllerを使い、商品一覧の取得と商品の追加を行うAPIを作成します。
この記事では、データを読む操作をGET、新しいデータを作る操作をPOSTへ割り当てます。URLへアクセスできればよいという理由で、更新処理をGETへ入れないことが重要です。HTTPメソッドとステータスコードから操作の意味が分かる、最小のControllerを作ります。
Controllerを有効にする
Program.csvar builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();AddControllersで必要なサービスを登録し、MapControllersでControllerのURLを有効にします。
GET APIを作成する
ProductsController.csusing Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/products")]
public sealed class ProductsController : ControllerBase
{
[HttpGet]
public IActionResult FindAll()
{
var products = new[]
{
new ProductResponse(1, "ノート", 200),
new ProductResponse(2, "ペン", 100),
};
return Ok(products);
}
}
public sealed record ProductResponse(int ProductId, string Name, decimal Price);GET /api/productsへアクセスすると、商品一覧がJSONで返ります。
URLからIDを受け取る
[HttpGet("{productId:int}")]
public IActionResult Find(int productId)
{
if (productId != 1)
{
return NotFound();
}
return Ok(new ProductResponse(1, "ノート", 200));
}GET /api/products/1の1がproductIdへ入ります。対象がない場合は404 Not Foundを返します。
POST APIを作成する
追加する内容はJSONのリクエスト本文で受け取ります。作成処理をPOSTにすることで、ブラウザやキャッシュが読み取り操作として扱うGETと区別できます。
public sealed record ProductCreateRequest(string Name, decimal Price);
[HttpPost]
public IActionResult Create(ProductCreateRequest request)
{
var product = new ProductResponse(
ProductId: 3,
Name: request.Name,
Price: request.Price
);
return CreatedAtAction(
nameof(Find),
new { productId = product.ProductId },
product
);
}以下のJSONをPOST /api/productsへ送信します。
{
"name": "消しゴム",
"price": 120
}CreatedAtActionは201 Createdと、作成したデータのURLを示すLocationヘッダーを返します。
実際のアプリケーションでは、POSTで受け取った値をデータベースへ保存し、採番されたIDをレスポンスへ使用します。
HttpGetとHttpPostの属性でHTTPメソッドを指定し、Ok、NotFound、CreatedAtActionで目的に合うレスポンスを返します。