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は保存処理を表す仮の依存先です。
CreatedAtActionのnameof(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()を呼ばないようにします。