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