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

ASP.NET CoreでURLとJSONから値を受け取る

APIでは、対象のID、検索条件、登録するデータを別の場所から受け取ります。ASP.NET Coreでは[FromRoute][FromQuery][FromBody]で入力元を明示できます。

IDと検索条件を受け取る

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/products")]
public sealed class ProductsController : ControllerBase
{
    [HttpGet("{id:int}")]
    public IActionResult FindById([FromRoute] int id, [FromQuery] string? locale)
    {
        return Ok(new { Id = id, Locale = locale ?? "ja" });
    }
}

GET /api/products/42?locale=enなら、idは42、localeenです。対象を特定する値はRoute、任意の絞り込みや表示条件はQueryに置くと意味が伝わります。

{id:int}はURLの値が整数であることを求めるルート制約です。/api/products/abcはこのActionに一致しません。数値として受け取れることと、そのIDの商品が存在することは別なので、存在しないIDにはAction内で404 Not Foundを返します。

JSONを受け取る

public sealed record CreateProductRequest(string Name, int Price);

[HttpPost]
public IActionResult Create([FromBody] CreateProductRequest request)
{
    return Ok(new { request.Name, request.Price });
}

このActionは先ほどのController内へ追加します。POSTするJSONは{"name":"ノート","price":200}です。

例えば次のように送信できます。

curl -X POST http://localhost:5000/api/products \
  -H 'Content-Type: application/json' \
  -d '{"name":"ノート","price":200}'

URLとポートは実際の開発環境に合わせて変更してください。Content-TypeがJSONであることも、サーバーが本文を解釈する際に重要です。

空の名前や負の価格を拒否したいなら、入力検証を追加します。URL・JSONから値を受け取っただけでは業務上の正しさは保証されません。


関連記事