ASP.NET Web API における、ルーティング についてまとめます。 WCF と似ているけれど、バインド方法が若干異なるので、注意が必要そうです。
目次
参考までに…以下はルーティングに関連する別記事へのリンクです。
デフォルト設定 (デフォルト の ルーティング)
Web API も クライアント から サーバー に アクセス があると、ルートテーブル に設定された情報に従って実行する クラス 、関数 が選択されます。 この ルートテーブル への設定は、App_Start フォルダ 配下にある WebApiConfig.cs ファイル に記述されます。
// App_Start / WebApiConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
デフォルト の ルーティング は api/{controller}/{id} なので、デフォルト の 呼び出し方 と 呼び出され方 の例は次のようになります。
| クライアントからのリクエスト | サーバーで実行される関数 | ||||
|---|---|---|---|---|---|
| メソッド | URI | コントローラー | アクション | 引数 | |
| 例1 | GET | http://[サーバー名]/[アプリケーション名]/api/xxxx | XxxxController クラス | Get メソッド | 引数なし |
| 例2 | GET | http://[サーバー名]/[アプリケーション名]/api/xxxx/5 | XxxxController クラス | Get メソッド | 5 |
| 例3 | POST | http://[サーバー名]/[アプリケーション名]/api/xxxx/5 | XxxxController クラス | Post メソッド | 5 |
つまり、デフォルト設定では以下のような挙動になります。
- リクエスト時 の大文字小文字は区別されない
- 実行する コントローラー の アクション (メソッド) は、 リクエスト時 の メソッド名 で自動的に選択される
ルーティングテーブル追加による変更
App_Start フォルダ 配下にある WebApiConfig.cs ファイル に追記することで、新しい ルーティング を設定する方法です。 以下の サンプルコード では、WCF と同じように アクション を指定させる ルーティング を追加しています。
// App_Start / WebApiConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "ControllerActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
カスタム属性による変更
メソッド毎に属性(HttpGet、HttpPost、HttpPut、HttpDelete 等)が存在するので、必要な メソッド に対応する属性を設定します。
namespace MvcApplication5.Controllers
{
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
public class XxxxController : ApiController
{
[HttpPost]
public HttpResponseMessage CreateNewProduct([FromBody] product)
{
// POST で呼び出される
}
}
}
今回、以下のサイトを参考にしました。
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!