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

ASP.NET CoreでAPIのHTTPステータスを使い分ける

APIのレスポンスは本文だけでなく、HTTPステータスでも結果を伝えます。すべてを200 OKにすると、利用側が成功・失敗を本文から独自に判定する必要があります。

取得と作成

[HttpGet("{id:int}")]
public IActionResult Find(int id)
{
    var product = products.Find(id);
    return product is null ? NotFound() : Ok(product);
}

[HttpPost]
public IActionResult Create(CreateProductRequest request)
{
    var product = products.Add(request);
    return CreatedAtAction(nameof(Find), new { id = product.Id }, product);
}

見つかった取得は200 OK、対象がない場合は404 Not Foundです。作成成功には201 Createdと作成したリソースのURLを示すLocationヘッダーを使えます。例のproductsは保存処理を表す仮の依存先です。

CreatedAtActionnameof(Find)new { id = product.Id }は、取得ActionのルートからURLを作るための指定です。取得ルートと名前が合っていないとURLを生成できないので、作成APIを試すときはLocationヘッダーも確認してください。

本文を返さない成功

削除に成功して返すデータがない場合は204 No Contentを使用できます。

[HttpDelete("{id:int}")]
public IActionResult Delete(int id)
{
    return products.Delete(id) ? NoContent() : NotFound();
}

入力形式が不正なら通常は400 Bad Requestです。ただし、同時更新や業務ルール上の拒否をすべて400へまとめず、状況に合うステータスを選びます。

クライアントから見た違い

const response = await fetch('/api/products/42');
if (response.status === 404) {
  // 対象がない画面を表示する
} else if (!response.ok) {
  // その他のエラーを表示する
} else {
  const product = await response.json();
  console.log(product);
}

fetchは404でも自動的には例外になりません。サーバーが意味のあるステータスを返せば、クライアントは画面の動作を選べます。204の場合は本文がないため、response.json()を呼ばないようにします。


関連記事