CData API Serverで作成したAPIでリレーションを使ってみる

2020.07.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部の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を合わせて取得(EventVenuevenuecityカラムのみ取得)

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のリソースでリレーションの設定をスキーマエディタで設定しておけば、一回のリクエストで親、子のオブジェクトをレスポンスに含めることができます。これによりリクエストの回数を減らしたり、クライアントで追加のマップ処理などをしなく良いので非常に便利です。

最後まで読んで頂いてありがとうございました。