miso_soup3 Blog

主に ASP.NET 関連について書いています。

ASP.NET WEB API でのステータスコードについて

あけましておめでとうございました。今年もよろしくお願いいたします。

ASP.NET WEB API はじめました〜

ASP.NET WEB API にて、
どういった時にどんなステータスコードを返すのか、返すべきなのか
わからなかったので簡単に調べました。

ASP.NET WEB API の働きによるもの

void

アクションメソッドの戻り値が void の時は、204 No Content を返すようになっています。
PUT でも GET でも同じです。

public void PutProduct(int id, Product product)
{
 //....
}
一般的なGET

アクションメソッドの戻り値が、何かの値であれば、
ステータスコードの指定がなくとも、200 OK を返します。

public IEnumerable<Product> GetAllProducts()
{
 return repository.GetAll();
}
エラーのとき

アクションメソッド内でエラーが起きたときは、
例外フィルター等を指定しなくても、500 Internal Server Error を返します。

public void GetError(int name)
{
 throw new ApplicationException();
}

HTTP の仕様により理想的とされるもの

新規追加した時

POST でデータを新規追加した時は、HTTP の仕様により、
201 Created を返すのがよいとされています。
下のコードでは、201 を返し、ヘッダーの Location に
新規追加したリソースを取得する URI を設定しています。

public HttpResponseMessage PostProduct([FromUri]Product item)
{
 item = repository.Add(item);
 var response = Request.CreateResponse<Product>(HttpStatusCode.Created, item);

 string uri = Url.Link("DefaultApi", new { id = item.Id });
 response.Headers.Location = new Uri(uri);
 return response;
}
リソースが見つからない時

データが存在しない場合は、お馴染みの 404 Not Found を返します。

public void DeleteProduct(int id)
{
 Product item = repository.Get(id);
 if (item == null)
 {
  throw new HttpResponseException(HttpStatusCode.NotFound);
 }

 repository.Remove(id);
}