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、localeはenです。対象を特定する値は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から値を受け取っただけでは業務上の正しさは保証されません。