ASP.NET Web API のルーティングとアクション: MVC 4 新機能シリーズ


今回は、以前のブログポスト ASP.NET Web API を使ってみよう で紹介した ASP.NET Web API について、その URL ルーティングとアクション メソッドへのマッピングについてご紹介します。


◆ ルーティング

Web API プロジェクトのデフォルトでは、Global.asax.cs ファイルの RegisterRoutes メソッドで下記のようにルーティングが定義されています。

   1: public static void RegisterRoutes(RouteCollection routes)
   2: {
   3:     ...
   4:  
   5:     routes.MapHttpRoute(
   6:         name: "DefaultApi",
   7:         routeTemplate: "api/{controller}/{id}",
   8:         defaults: new { id = RouteParameter.Optional }
   9:     );
  10:  
  11:     ...
  12:  
  13: }

このルーティングの定義により、Web API プロジェクト テンプレートで追加される ValuesController に対する各アクション メソッドの HTTP リクエストは、例えば id パラメータ “1” を付加した GET リクエストの場合 “/api/values/1” の URI となります。

下記は、ValuesController の各アクション メソッドと HTTP メソッド、および URI の対応表です。

アクション

HTTP メソッド

相対 URI

全てのデータのリストを取得する

GET

/api/values

id で指定されたデータを取得する

GET

/api/values/id

新しいデータを追加する

POST

/api/values

id で指定されたデータを更新する

PUT

/api/values/id

id で指定されたデータを削除する

DELETE

/api/values/id



◆ アクション メソッドとのマッピング

上記のルーティングでは、アクション メソッドへのマッピングは明示的に指定されていません。それでは、どのようにしてアクション メソッドとのマッピングがおこなわれているのでしょうか。

Web API プロジェクト テンプレートで追加される ValuesController には、下記の通り GET, POST, PUT, DELETE の各 HTTP メソッドに対応したアクションが用意されています。

   1: namespace ProductsAPI.Controllers
   2: {
   3:     public class ValuesController : ApiController
   4:     {
   5:         // GET /api/values
   6:         public IEnumerable<string> Get()
   7:         {
   8:             return new string[] { "value1", "value2" };
   9:         }
  10:  
  11:         // GET /api/values/5
  12:         public string Get(int id)
  13:         {
  14:             return "value";
  15:         }
  16:  
  17:         // POST /api/values
  18:         public void Post(string value)
  19:         {
  20:         }
  21:  
  22:         // PUT /api/values/5
  23:         public void Put(int id, string value)
  24:         {
  25:         }
  26:  
  27:         // DELETE /api/values/5
  28:         public void Delete(int id)
  29:         {
  30:         }
  31:     }
  32: }

この ValuesController の各アクション メソッドと HTTP メソッド(GET, POST, PUT, DELETE)との対応は、単純な命名規約のもとでマッピングされます。例えば、アクション メソッド名の開始文字列が “Get...” で始まる場合、HTTP の GET メソッドのリクエストで実行されます。なお、Get アクション メソッドは int 型の引数 id をとるメソッドと引数なしのメソッドの 2 種類があり、同じ GET のリクエストでも URI に付加されるパラメータの有無によってマッピングされ、アクション メソッドが実行されます。

同様にして、HTTP POST のリクエストは “Post...” で始まるアクション メソッドに、HTTP PUT のリクエストは “Put...”、HTTP DELETE のリクエストは “Delete...” にマッピングされます。

つまり、GET に対応するアクション メソッド名を変更して、例えば GetValue とか GetProduct などとしても OK です。

この命名規約により、各アクション メソッドに [HttpGet] や [HttpPost] などの HTTP メソッド属性を付加する必要がなくなっています(もちろん、この HTTP メソッド属性を使って、任意のアクション名を使用することも可能です)。

Web API では、上記のようなルーティングと命名規約による HTTP メソッドとアクションのマッピングによって、RESTful な CRUD (Create, Read, Update, Delete) 処理に対応した HTTP サービスを容易に実装することができます。

Comments (0)

Skip to main content