郵便番号検索など、今ではさまざまなサービスがWeb APIとして公開されてきている。こうしたWeb APIは、スマートデバイス向けのネイティブ・アプリだけではなく、シングル・ページ・アプリのようなWebアプリからでも呼び出されている。
ASP.NET MVC 4には、このWeb APIを実現する仕組みとして、またRESTfulサービスを実現するプラットフォームとして、「ASP.NET Web API」と呼ばれるフレームワークが追加された。
ASP.NET Web APIは以下のような機能が実装されている。
2012.2 Updateでは上記に加えて、Web APIに関連して、いくつかの機能が追加されている。ここではASP.NET Web API ODataについて紹介する。
OData(Open Data)プロトコル(以降、単に「OData」)は、CRUD(create、read、update、delete)操作を通じてデータセットへの問い合わせと操作を行うための統一的な手法を提供する、Web用のデータ・アクセス・プロトコルだ。また、ODataはXML形式のAtomPubとJSONの両フォーマットをサポートし、扱うデータに関するメタデータを公開する方法を定義する。このメタデータを利用してクライアントは型情報やデータセットの関係について知ることができるようになる。ODataについての仕様などは、http://www.odata.orgを参照されたい。
Web APIでは、データセットに対してODataに関する操作やエンドポイントの作成などを簡単に行える仕組みが用意されている。
ここでは、ODataを使用したWeb APIの例を紹介する。具体的なコードは、ODataSampleプロジェクトを参照のこと(ダウンロードはこちらから)。
このサンプルでは、Personオブジェクトを取得するだけのWeb APIを定義する。まずPersonクラスをModelsフォルダ以下に作成する。Modelsフォルダ上で右クリックし、(表示されるコンテキスト・メニューから)[追加]−[クラス]を選択する(次の画面を参照)。
クライアントからエンティティを指定して検索できるようにするにはエンティティのキーとなるプロパティが必要になる。今回のサンプルでは、次のコードに示すように、IDプロパティをエンティティのキーとして使用する。またこのIDプロパティは、バックエンドのデータベースでは主キーとして利用されることになる。
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
次にODataを扱うためのコントローラを実装する。先ほどと同様にControllersフォルダ上で右クリックして今度は[追加]−[コントローラー]を選択する。
これにより次の画面のようなダイアログが表示される。このダイアログでは、コントローラ名として「PeopleController」を指定している。またEntity Frameworkを使用しないので、スキャフォールディングのオプションにあるテンプレート設定項目には空のAPIコントローラを指定した。
次に、ApiControllerクラスを継承している部分を「EntitySetController<Person, int>」クラスを継承するように変更する。ここで指定したEntitySetController<TEntity, TKey>クラスは、ODataのエンティティを公開するために必要な処理を実装しているコントローラで、ODataControllerクラスを継承しており、さらにODataControllerクラスはApiControllerクラスを継承している。
今回はサンプルということで、Personオブジェクトを静的(static/Shared)なリストで保持し、一覧取得と指定されたキーに対応するPersonオブジェクトを返すメソッドを追加する。
EntitySetControllerクラスには、これらのメソッドがあらかじめ定義されているので、次の2つのメソッドをオーバーライドして実装する。
実装例は以下のようになる。
using ODataSample.Models; // Personクラス
……省略……
using System.Web.Http.OData; // EntitySetControllerクラス
namespace ODataSample.Controllers
{
public class PeopleController : EntitySetController<Person, int>
{
static List<Person> people = new List<Person>
{
new Person() { ID=1, FirstName="一郎", LastName="田中" },
new Person() { ID=2, FirstName="二郎", LastName="鈴木" },
new Person() { ID=3, FirstName="三郎", LastName="山田" },
new Person() { ID=4, FirstName="四郎", LastName="池田" },
new Person() { ID=5, FirstName="五郎", LastName="佐藤" },
};
public override IQueryable<Person> Get()
{
return people.AsQueryable();
}
protected override Person GetEntityByKey(int key)
{
return people.FirstOrDefault(p => p.ID == key);
}
}
}
最後にWeb APIとして外部からアクセスできるようにするために、ルーティングの登録を行う。登録処理を行うコードは、「App_Start\WebApiConfig.cs」ファイルのRegisterメソッドに以下の内容で追加する。
// ODataのエンドポイント用にEDMを作成
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Person>("People");
Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
// ルーティング登録
config.Routes.MapODataRoute("ODataRoute", "odata", model);
エンティティ・データ・モデル(EDM)はデータの抽象モデルで、メタデータの作成などに使用される。上記の例では、Personクラスのエンティティ・セットを「People」という名前で登録している。MapODataRouteメソッドでは、ODataのモデルとURIとの対応関係を登録している。
この例では、Personオブジェクトの一覧情報にアクセスするためのURIは以下のようになる。
http://ホスト名/odata/People
ブラウザから上記URIを指定してPersonオブジェクトの一覧情報を取得すると、以下のようなJSON形式データが返ってくる。
{
"odata.metadata":"http://localhost:60203/odata/$metadata#People","value":[
{
"ID":1,"FirstName":"¥u4e00¥u90ce","LastName":"¥u7530¥u4e2d"
},{
"ID":2,"FirstName":"¥u4e8c¥u90ce","LastName":"¥u9234¥u6728"
},{
"ID":3,"FirstName":"¥u4e09¥u90ce","LastName":"¥u5c71¥u7530"
},{
"ID":4,"FirstName":"¥u56db¥u90ce","LastName":"¥u6c60¥u7530"
},{
"ID":5,"FirstName":"¥u4e94¥u90ce","LastName":"¥u4f50¥u85e4"
}
]
}
次に、「ID=1」のデータを取得するには、次のようにクエリ・パラメータとして「key=1」を追加してブラウザでアクセスする。
http://ホスト名/odata/People?key=1
得られる結果は以下のようになる。
{
"odata.metadata":"http://localhost:60203/odata/$metadata#People/@Element",
"ID":1,"FirstName":"¥u4e00¥u90ce","LastName":"¥u7530¥u4e2d"
}
Copyright© Digital Advantage Corp. All Rights Reserved.