zukucode
主にWEB関連の情報を技術メモとして発信しています。

ASP.NET Core ControllerでGETとPOSTのAPIを作成する

ASP.NET CoreのControllerを使い、商品一覧の取得と商品の追加を行うAPIを作成します。

この記事では、データを読む操作をGET、新しいデータを作る操作をPOSTへ割り当てます。URLへアクセスできればよいという理由で、更新処理をGETへ入れないことが重要です。HTTPメソッドとステータスコードから操作の意味が分かる、最小のControllerを作ります。

Controllerを有効にする

Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();

var app = builder.Build();
app.MapControllers();
app.Run();

AddControllersで必要なサービスを登録し、MapControllersでControllerのURLを有効にします。

GET APIを作成する

ProductsController.cs
using 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/11productIdへ入ります。対象がない場合は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
}

CreatedAtAction201 Createdと、作成したデータのURLを示すLocationヘッダーを返します。

実際のアプリケーションでは、POSTで受け取った値をデータベースへ保存し、採番されたIDをレスポンスへ使用します。

HttpGetHttpPostの属性でHTTPメソッドを指定し、OkNotFoundCreatedAtActionで目的に合うレスポンスを返します。


関連記事