次の方法で共有


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 サービスを容易に実装することができます。