ASP.NET Web APIでデータ蓄積の3回目です。前回は蓄積するデータとして温度データをイメージしてそのモデルをコードファーストで書いてみました。今回は、MVCのCでコントローラの部分です。VのViewについては次回以降に書きます。
ASP.NETでWeb APIを構築する際のコントローラは今現在で、System.Web.Http.ApiController クラスを使って実装します。このコントローラで実際のWeb APIの各URLの処理が実行されます。HTTPのGetで簡単なJSON形式のレスポンスを返すAPIを実装してみます。
早速簡単なところから始めます。今回は、System.Web.Http.ApiController の基本的な実装のみを取り上げるという方向で全くファイルがないASP.NETのプロジェクトから作成します。
今回のプロジェクト一式は以下です。(※単なるサンプルプログラムです。ご利用による不具合、不利益等について弊社は一切責任を負わないものとします。)
Visual Studio Commnunity 2013でのプロジェクト一式
Visual Studio(ここでは Visual Studio Commnunity 2013です。) でプロジェクトを作成します。
[ファイル] -> [新規作成] -> [プロジェクト] の順にクリックします。
以下のように、ASP.NET Webアプリケーションを選択して、任意のプロジェクト名を入力して次に進みます。
次に、今回はわざわざEmptyを選択します。Web APIのテンプレートを使った実装方法は次回以降に書きます。
これで全くファイルのないプロジェクトが出来ました。ここからSystem.Web.Http.ApiController クラスでのコントローラを実装します。
Microsoft ASP.NET Web APIを追加します。
[ツール] -> [NuGetパッケージマネージャー] -> [ソリューションのNuGetパッケージの管理]の順にクリックします。Microsoft ASP.NET Web APIを検索してインストールします。
これでプロジェクトの参照設定にいろいろと追加されます。ここからコントローラを実装していきます。
ルーティングの設定
ルーティング、つまりコントローラのURLを設定します。これは、Global.asaxをプロジェクトに追加してそこに追加します。
プロジェクト名を右クリック -> [新規作成] -> [追加] -> [新しい項目]を選択します。
グローバルアプリケーションクラスを選択します。ファイル名はそのままです。
これで、Global.asaxが追加されました。
using System.Web; using System.Web.Security; using System.Web.SessionState; using System.Web.Http; // これを追加 namespace APIController1 { public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { GlobalConfiguration.Configure(config => { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); }); } //以下は省略します。
これは、要するにアプリケーション起動時にルーティングの設定を行っているということです。この設定でAPIには、api/コントローラ名/パラメータ というURLでアクセス出来ます。
実際にコントローラを追加します。まずはやはり、HelloWorldContollerを追加してみます。
プロジェクト名を右クリック -> [新規作成] -> [追加] -> [新しい項目]を選択します。
あえて何もない状態からということでクラスを選択します。ここでは、HelloWorldController.csとしました。Contollerという部分は規約なので必ず付けます。
以下のように編集します。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http; //追加する namespace APIController1 { /// <summary> /// HelloWorldController(System.Web.Http.ApiControllerから派生) /// </summary> public class HelloWorldController : ApiController { public string Get() { return "HelloWorld"; } } }
これで、http://(ドメイン名等)/api/HelloWorld に対応するHTTP GETのAPIが実装出来たことになります。デバッグの開始で実行してみます。ここでは空の状態のプロジェクトから始めたので既定のファイルはありません。そのため起動時は以下のようなエラー表示になります。
これは気にしないで、URLで api/HelloWorld を指定します。ここでは以下のように指定しました。
http://localhost:49318/api/HelloWorld
そうすると、以下のようにレスポンスがダウンロードファイルとして戻ります。画面下の部分です。
これを「ファイルを開く」を選択します。そうすると、Visual Studioで開かれました。JSONというファイル(拡張子)がVisual Studioに割り当てられている状態だからと思います。
以上でAPIの呼び出しが確認出来ました。しからながら単純な文字列だけなのでJSON形式を確認する意味で前回のモデルの中のセンサーデバイスを部分的に使ってみます。このモデルのリストを返すというコントローラを作成します。HelloWorldと同様にSensorDevicesController.csというファイルを追加します。
このファイルに通常はこういったことはしないですがモデルも書き込みます。さらに、Get()を作成して適当にモデルを生成して返します。以下のようになります。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http; //追加する namespace APIController1 { public class SensorDevicesController : ApiController { public SensorDevice[] Get() { SensorDevice[] devices = new SensorDevice[3]; devices[0] = new SensorDevice { DeviceId = 1, DeviceName = "DevName1", OwnerName = "Yokohama Company" }; devices[1] = new SensorDevice { DeviceId = 2, DeviceName = "DevName2", OwnerName = "Shinagawa Company" }; devices[2] = new SensorDevice { DeviceId = 3, DeviceName = "DevName3", OwnerName = "Shibuya Company" }; return devices; } } /// <summary> /// センサーデバイス /// </summary> public class SensorDevice { public int DeviceId { get; set; } public string DeviceName { get; set; } public string OwnerName { get; set; } } }
これをHelloWorldと同様に、api/SensorDevices で呼び出します。以下の結果が返りました。
[ { "DeviceId": 1, "DeviceName": "DevName1", "OwnerName": "Yokohama Company" }, { "DeviceId": 2, "DeviceName": "DevName2", "OwnerName": "Shinagawa Company" }, { "DeviceId": 3, "DeviceName": "DevName3", "OwnerName": "Shibuya Company" } ]
次に以下のように、もう一つGet()を追加します。これでGet()でパラメータが取得出来ます。
public SensorDevice Get(int Id) { switch (Id) { case 1: return new SensorDevice { DeviceId = 1, DeviceName = "DevName1", OwnerName = "Yokohama Company" }; case 2: return new SensorDevice { DeviceId = 2, DeviceName = "DevName2", OwnerName = "Shinagawa Company" }; case 3: return new SensorDevice { DeviceId = 3, DeviceName = "DevName3", OwnerName = "Shibuya Company" }; default: break; } return null; }
このGet()には、api/SensorDevice/1 または、api/SensorDevices?id=1の形式でアクセスできます。
それでは、Postはどうなるのかということですが、PostはViewと一緒に次回に書きます。
今回のシリーズの一覧です。
ASP.NET Web APIでデータ蓄積(その1)ASP.NET Web APIとは
ASP.NET Web APIでデータ蓄積(その2)ASP.NET コードファーストでのモデル構築
ASP.NET Web APIでデータ蓄積(その3)ASP.NET ApiControllerクラス
ASP.NET Web APIでデータ蓄積(その4)ASP.NET ApiControllerクラスとView
ASP.NET Web APIでデータ蓄積(その5)ASP.NET Web APIテンプレートからの構築
ASP.NET Web APIでデータ蓄積(その6)ASP.NET Web APIでの動作確認
ASP.NET Web APIでデータ蓄積(その7)Raspbery Piからの温度データ蓄積
その他関連サイト
Getting Started with ASP.NET Web API 2 (C#)
Using Web API 2 with Entity Framework 6
Entity Framework Code First の規約
Entity Framework Code First のデータ注釈
Entity Framework での新しいデータベース向けの Code First
Amazon関連商品