CData API Serverで作成したAPIでリレーションを使ってみる
はじめに
データアナリティクス事業本部のkobayashiです。
REST API構築ツール CData API Server で作成したAPIではエンティティ間のリレーションを設定することで対象のリソースの親オブジェクトや子オブジェクトをまとめて取得できます。 このリレーションを使ってAPIにリクエストを送りそのレスポンスを確認してみたいと思います。
CData API Serverのインストール方法やデータソースの設定方法は下記のエントリをご参照ください。
環境
- Windows 10
- CData API Server - 19.0.7362.0
また今回使用しているCData API Serverのホストとポートは以下になります。
192.168.7.129:8153
リレーションの設定
この図を元にCData API Serverのリソース設定にてスキーマエディタを使ってリレーションの設定を行います。
スキーマエディタでの設定
スキーマエディタにてカラム定義にリレーションを設定するには
relationships="リレーション名(リソース名.カラム名)"
の形で属性を追加します。
子から親のリレーションを設定する場合にはこの形式で良いのですが、親で子のリレーションを設定するには
relationships="*リレーション名(リソース名.カラム名)"
の形でリレーション名の前に*
アスタリスクが必要です。ご注意ください。
今回の例ですと
rs_event
のカラム定義に設定するのは以下の形になります。
<attr name="catid" ... relationships="EventCategory(rs_category.catid)"/> <attr name="dateid" ... relationships="EventDate(rs_date.dateid)"/> <attr name="venueid" ... relationships="EventVenue(rs_venue.venueid)"/>
一方親になるrs_cateroty,rs_date,rs_venue
のカラム定義は以下の形になります。
// rs_cateroty <attr name="catid" ... relationships="*Events(rs_event.catid)" /> // rs_date <attr name="dateid" ... relationships="*Events(rs_event.dateid)" /> // rs_venue <attr name="venueid" ... relationships="*Events(rs_event.venueid)" />
1.CData API Serverのリソース
でリレーションを設定したいリソースにカーソルを合わせると下図のようなアイコンが出るので押下する。
2.下図の様なスキーマエディタの編集画面が開くのでカラム定義に先に解説したリレーション設定を追加する。
以上でリレーションの設定は終わりです。では次にこの設定を使ってAPIを叩きレスポンスを確認します。
リレーションの確認
$expand
のパラメータを使うことで集計が可能になります。
$apply=リレーション名
の形で指定すればよく、複数のリレーションを設定してあるのでそれらを取得したいある場合はカンマ区切りでつなげればそれぞれの値が取得できます。他のパラメータを同時に扱うこともできるので$filter
パラメータを使ってフィルターをかけたリソースのリレーションも取得できます。またリレーションした親や子に対してパラメータを使うこともできます。
それでは実際にAPIを叩いてレスポンスを取得してみます。
URL1
rs_category
を取得する際に子オブジェクトを取得
http://192.168.7.129:8153/api.rsc/rs_category?$expand=Events
レスポンス1
Events
キーにrs_event
のデータが入った状態でレスポンスが取得できます
{ "@odata.context": "http://192.168.7.129:8153/api.rsc/$metadata#rs_category", "value": [ { "Events": [], "catid": 1, "catdesc": "Major League Baseball", "catgroup": "Sports", "catname": "MLB" }, { "Events": [ { "catid": 6, "dateid": 1827, "eventid": 1433, "eventname": "Grease", "starttime": "2008-01-01T19:00:00.0000+09:00", "venueid": 248 }, { "catid": 6, "dateid": 1828, "eventid": 1738, "eventname": "Beatles LOVE", "starttime": "2008-01-02T20:00:00.0000+09:00", "venueid": 260 }, ... ], "catid": 6, "catdesc": "Musical theatre", "catgroup": "Shows", "catname": "Musicals" }, ... ] }
URL2
rs_category
を取得する際に子オブジェクトを取得(子オブジェクトはdateid=2191
でフィルターしたeventname,starttime
カラムに絞り込む)
http://192.168.7.129:8153/api.rsc/rs_category?$expand=Events($filter=dateid eq 2191;$select=eventname,starttime)
リレーションで複数パラメータを使う場合は;
セミコロンで繋げます。
レスポンス2
Events
キーにrs_event
のデータがフィルターがかかった状態でレスポンスが取得できます
{ "@odata.context": "http://192.168.7.129:8153/api.rsc/$metadata#rs_category", "value": [ { "Events": [], "catid": 1, "catdesc": "Major League Baseball", "catgroup": "Sports", "catname": "MLB" }, { "Events": [ { "eventname": "Blue Man Group", "starttime": "2008-12-31T14:30:00.0000+09:00" }, { "eventname": "Mamma Mia!", "starttime": "2008-12-31T14:30:00.0000+09:00" }, ... ], "catid": 6, "catdesc": "Musical theatre", "catgroup": "Shows", "catname": "Musicals" }, ... ] }
URL3
rs_event
を取得する際にdateid=1827
のものを3件取得し、その親オブジェクトEventCategory,EventDate,EventVenue
を合わせて取得(EventVenue
はvenuecity
カラムのみ取得)
http://192.168.7.129:8153/api.rsc/rs_event/?$filter=dateid eq 1827&$top=3&$expand=EventCategory,EventDate,EventVenue($select=venuecity)
レスポンス3
EventDate,EventCategory,EventVenue
キーにrs_date,rs_category,rs_venue
のデータにフィルターがかかった状態でレスポンスが取得できます
{ "@odata.context": "http://192.168.7.129:8153/api.rsc/$metadata#rs_event", "value": [ { "EventDate": { "caldate": "2008-01-01", "dateid": 1827, "day": "WE", "holiday": true, "month": "JAN", "qtr": "1", "week": 1, "year": 2008 }, "EventCategory": { "catid": 6, "catdesc": "Musical theatre", "catgroup": "Shows", "catname": "Musicals" }, "EventVenue": { "venuecity": "New York City" }, "catid": 6, "dateid": 1827, "eventid": 1376, "eventname": "The King and I", "starttime": "2008-01-01T14:30:00.0000+09:00", "venueid": 235 }, { "EventDate": { "caldate": "2008-01-01", "dateid": 1827, "day": "WE", "holiday": true, "month": "JAN", "qtr": "1", "week": 1, "year": 2008 }, "EventCategory": { "catid": 6, "catdesc": "Musical theatre", "catgroup": "Shows", "catname": "Musicals" }, "EventVenue": { "venuecity": "New York City" }, "catid": 6, "dateid": 1827, "eventid": 1334, "eventname": "The King and I", "starttime": "2008-01-01T14:30:00.0000+09:00", "venueid": 208 }, { "EventDate": { "caldate": "2008-01-01", "dateid": 1827, "day": "WE", "holiday": true, "month": "JAN", "qtr": "1", "week": 1, "year": 2008 }, "EventCategory": { "catid": 6, "catdesc": "Musical theatre", "catgroup": "Shows", "catname": "Musicals" }, "EventVenue": { "venuecity": "Boston" }, "catid": 6, "dateid": 1827, "eventid": 1433, "eventname": "Grease", "starttime": "2008-01-01T19:00:00.0000+09:00", "venueid": 248 } ] }
まとめ
CData API Serverのリソースでリレーションの設定をスキーマエディタで設定しておけば、一回のリクエストで親、子のオブジェクトをレスポンスに含めることができます。これによりリクエストの回数を減らしたり、クライアントで追加のマップ処理などをしなく良いので非常に便利です。
最後まで読んで頂いてありがとうございました。