こんにちは、特派員のI.Mです。
前二回はおよそエンジニアらしからぬ、SAPの回し者のような記事でしたが、
今回はオープンな仕様のWebAPIプロトコルであるODataについての紹介記事を書いてみたいと思います。
(WebAPIの入門的な話にもなっていると思います)

ODataって何?

ODataは正式名称を”Open Data Protocol”と言って、RESTfulなWebAPI(Webサービス)プロトコルです。Microsoft主導で策定されたものですが、OASISとISOで標準化されています。
APIマネジメントとか、APIエコノミーといったキーワードが飛び交う昨今、今後重要になるものと考えています。

『RESTful』とは、簡単に言って以下の四つの原則を持つということです。
(詳細は別記事に譲ります)

  • Addressability → どのデータも一意なURI表現が可能
  • Stateless → セッションの状態管理(ECサイトのカート等)などに依存しない
  • Connectability → 情報と情報をリンクさせることができる
  • Uniform Interface → 情報の操作はHTTPメソッド(GET,POST,PUT,DELETE..)を利用

データの取得

触ってみるには、ODataのサイトを訪れてみます。
Developersタブの”Reference Service”をクリックすると、サンプル利用できるODataサービスの紹介ページが表示されます。
2017年7月現在、最新仕様バージョンはv4でサンプルは一つだけですが、v2,v3ではいくつかのサンプルが登録されています。
せっかくなのでv4のTripPinサービスにアクセスしてみましょう。
英語ですが、基本的な使い方(Basic Usage)がこのページに記載されているので記載されているURLにアクセスすればすぐ結果が表示されます。
または、Developersタブの”Getting Started”からUnderstand OData in 6stepsというチュートリアルのようなものが用意されています。
(全ページ英語ですが、最近はGoogle翻訳の性能が向上しているので苦にならないですよね!笑)

メタデータ

ODataでは、提供されるサービスのメタデータを参照することができます。
ODataサービスのURLに”$metadata”と付与するだけです。

http://services.odata.org/TripPinRESTierService/$metadata

ODataのメタデータ(≒関連情報)には、ODataサービスで取得できるデータの構造や関係性、特殊な呼び出しが必要なAPIなどの情報がXML形式で記載されています。
以下、上記URLで表示されるメタデータのXMLタグを順に見てみましょう。

<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
<edmx:DataServices>
<Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Microsoft.OData.Service.Sample.TrippinInMemory.Models">

一行目に、これから記載するXMLのスキーマ(≒記述ルール)を宣言しています。ODataのv4ですね。
Edmxは”Entity Data Model”+XML(Schema)の頭文字と思われます。
DataServicesでODataサービス本体の宣言を、Schemaでこれから記載するODataサービス構造の概念であること、各種オブジェクトの名前空間(名称領域)をNamespaceで定義しています。
(各種オブジェクトは同名オブジェクトの取り違えを避けるため “Microsoft.OData.Service.Sample.TrippinInMemory.Models”という名前で修飾されます)

<EntityType Name="Person">
<Key>
<PropertyRef Name="UserName"/>
</Key>
<Property Name="UserName" Type="Edm.String" Nullable="false"/>
(中略)
<NavigationProperty Name="Trips" Type="Collection(Microsoft.OData.Service.Sample.TrippinInMemory.Models.Trip)"/>
</EntityType>

EntityTypeはオブジェクトの構造の宣言で、SQLで言えばテーブル定義のようなものです。
Keyは主キーを、Propertyでオブジェクトのメンバ定義、NavigationPropertyは別の構造をメンバとして持つことの宣言となります。
ここではTripという名前(”~Models.”までは名前空間)でのコレクションを持つということです。
(PropertyRefは、Propertyで定義したメンバの参照を示します)

<ComplexType Name="Location">
<Property Name="Address" Type="Edm.String"/>
<Property Name="City" Type="Microsoft.OData.Service.Sample.TrippinInMemory.Models.City"/>
</ComplexType>
(中略)
<EnumType Name="PersonGender">
<Member Name="Male" Value="0"/>
<Member Name="Female" Value="1"/>
<Member Name="Unknow" Value="2"/>
</EnumType>

通常、メンバの型はEDMであらかじめ定義されたもの(例…文字列型:Edm.String/数値型:Edm.Int32 etc)を使用しますが、ComplexType宣言を使用して複数の型の組み合わせ構造を定義したり、EnumTypeを指定してとり得る値をあらかじめ決めてしまうことができます。ここではLocationという”住所データ”の構造をComplexTypeで定義し、人や空港のメンバとして複数個所で利用しています。Cityは更なる別構造の参照です。またPersonGender=性別という列挙型を定義し、規定値以外が入らないように定義しています。

<EntityContainer Name="Container">
<EntitySet Name="People" EntityType="Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person">
<NavigationPropertyBinding Path="Friends" Target="People"/>

これまではこのODataサービスの中で扱うデータなどの構造の定義でしたが、EntityContainerタグ内は実際にAPIとして利用するために、サービスの下にURLとして指定するための定義となります。
EntitySetは、EntityTypeで定義した構造を持つデータのコレクションを定義するもので、
データ構造の名前が”Person”であったところ、コレクションでは”People”(複数形)となっていることがわかります。
内部でバインドされた別エンティティのコレクションの参照名も”Friends”(構造はPersonと同じ)となっています。

このように、XMLを見慣れない人には理解しづらいかも知れませんが、
一つ一つ紐解いていけばODataで何を定義されているのかがわかります。

クライアントツール

基本的にデータの読み出しだけであれば、通常のWebブラウザのアドレス欄だけで事足りますが、
ODataはデータの読み出し(=READ)だけでなく更新(=CREATE/UPDATE/DELETE)も可能です。
今回参照したODataサービス(TripPin)も読み書き可能なのですが、更新APIのテストにはRESTクライアントツールが便利です。
odata.orgではPOSTMANというツールを推奨しているようです。
Windowsにインストールするソフトウェアとしても存在しますが、WebブラウザにChromeを使用している場合、ブラウザのアドオン(Chromeアプリ)としてインストールすることが可能です。
是非インストールしてOData(WebAPI)に慣れ親しんでくださいね。
(余談ですが、GoogleはWindowsのChromeアプリ追加機能を2018年までに段階的に終了させるそうです。Windowsでの開発者は困りますよね。。。)