CData ドライバーで REST を簡単に扱う
CData REST ドライバーは、ローカルおよびリモートのデータをリレーショナルテーブル、ビュー、ストアドプロシージャとしてモデル化することで、REST リソースへの標準ベースのアクセスを提供します。高性能な処理操作により、HTTP リクエストの送信やレスポンスの処理といった複雑さを隠蔽し、使い慣れた SQL-92 クエリを使って REST リソースを操作できます。
この記事では、サンプルの REST データを見ながら、CData REST ドライバーの設定方法について説明していきます。
REST リソースへの接続
このセクションでは、単一のエンドポイントを持つ REST リソースに接続します。返されるデータは、ロサンゼルス市の 2010 年国勢調査データで、ZIP コードごとにグループ化されています。
データの抜粋
以下は、サンプル REST リソースに含まれるデータの抜粋です。
<response>
<row>
<row _id="228" _uuid="A47815EC-0DA0-499D-9CE6-616A23C4F155" _position="228" _address="http://data.lacity.org/resource/nxs9-385f/228">
<zip_code>91371</zip_code>
<total_population>1</total_population>
<median_age>73.5</median_age>
<total_males>0</total_males>
<total_females>1</total_females>
<total_households>1</total_households>
<average_household_size>1.00</average_household_size>
</row>
<row _id="1" _uuid="1AE8EAF5-D6E6-4AF9-88FD-3CF179F2A8FC" _position="1" _address="http://data.lacity.org/resource/nxs9-385f/1">
<zip_code>90001</zip_code>
<total_population>57110</total_population>
<median_age>26.6</median_age>
<total_males>28468</total_males>
<total_females>28642</total_females>
<total_households>12971</total_households>
<average_household_size>4.40</average_household_size>
</row>
...
</row>
</response>
接続の設定
REST リソースのデータ形式がわかったところで、接続を設定していきましょう。ロサンゼルスの 2010 年国勢調査データの HTTP エンドポイントは、URL https://data.lacity.org/api/views/nxs9-385f/rows.xml で XML 形式で利用できます。この値を URI プロパティに設定します。
REST リソースが XML データを返すため、Format プロパティを "XML" に設定します。XPath プロパティを "/response/row/row" に設定することで、繰り返される各 row 子要素が REST リソースを表すデータテーブルの 1 行として表示されます。これらのプロパティを設定すると、生の REST リソースではなくデータテーブルとしてデータを操作できるようになります。CData REST ドライバーは XML データを解析し、各 row 要素の子要素と XML 属性を含むすべての利用可能なデータを公開します。
ドライバーが自動的にスキーマファイルを生成するように設定するには、GenerateSchemaFiles を "OnUse" または "OnStart" に設定し、Location をディスク上のアクセス可能なディレクトリに設定します。完成した接続文字列は以下のとおりです:
URI=https://data.lacity.org/api/views/nxs9-385f/rows.xml; Format=XML; XPath=/response/row/row; GenerateSchemaFiles=OnStart; Location=C:/Users/Administrator/MySchemaDirectory;
この接続文字列を使用すると、ドライバーは XMLData という名前の単一テーブルを公開し、データ内の各 row 要素の属性と子要素をカラムとして持ちます。以下は、返されたデータの一部を示すテーブルです(可読性のため一部を省略しています)。次のセクションでは、国勢調査データ用に生成されたスキーマファイルの説明と、カスタムスキーマファイルの例を示します。
SELECT * FROM XMLData
| _address | _id | _position | _uuid | average_household_size | median_age | total_females | total_households | total_males | total_population | zip_code |
|---|---|---|---|---|---|---|---|---|---|---|
| https://.../1 | 1 | 1 | 1AE8EAF5-... | 4.4 | 26.6 | 28642 | 12971 | 28468 | 57110 | 90001 |
| https://.../2 | 2 | 2 | D2556F56-... | 4.36 | 25.5 | 26347 | 11731 | 24876 | 51223 | 90002 |
| https://.../3 | 3 | 3 | 5586CDA7-... | 4.22 | 26.3 | 33635 | 15642 | 32631 | 66266 | 90003 |
| https://.../4 | 4 | 4 | D14749EB-... | 2.73 | 34.8 | 30878 | 22547 | 31302 | 62180 | 90004 |
| https://.../5 | 5 | 5 | 3F9BD39B-... | 2.5 | 33.9 | 18382 | 15044 | 19299 | 37681 | 90005 |
REST リソースをデータベースとしてモデル化する
接続する REST リソースが単一のエンドポイントを持つ場合は、接続文字列プロパティを使用してデータベースモデルを作成するのが最適です。しかし、ほとんどの REST リソースは複数のエンドポイントでデータを公開し、メッセージの送信やドキュメントのアップロードなどのアクションを実行するエンドポイントが含まれることもあります。これらの場合は、REST エンドポイントをテーブル、ビュー、ストアドプロシージャとしてモデル化するスキーマファイルを作成するのが最適なアプローチです。
LACensusData2010.rsd
以下は、2010 年ロサンゼルス国勢調査データの REST リソースに基づいたスキーマファイルで、RSBScript を使用して記述されています。スキーマファイルの詳細な説明が続きます。RSBScript の使用方法について詳しくは、オンラインヘルプドキュメントの RSBScript リファレンスセクションを参照してください。
<rsb:script xmlns:rsb="http://www.rssbus.com/ns/rsbscript/2" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<rsb:info title="LACensusData2010" desc="2010 Census data for the city of Los Angeles, grouped by ZIP code." xmlns:other="http://www.rssbus.com/ns/rsbscript/2/other">
<attr name="ID" xs:type="integer" readonly="false" other:xPath="@_id" />
<attr name="AverageHouseholdSize" xs:type="double" readonly="false" other:xPath="average_household_size" />
<attr name="MedianAge" xs:type="double" readonly="false" other:xPath="median_age" />
<attr name="TotalFemales" xs:type="integer" readonly="false" other:xPath="total_females" />
<attr name="TotalHouseholds" xs:type="integer" readonly="false" other:xPath="total_households" />
<attr name="TotalMales" xs:type="integer" readonly="false" other:xPath="total_males" />
<attr name="TotalPopulation" xs:type="integer" readonly="false" other:xPath="total_population" />
<attr name="ZIPCode" xs:type="integer" readonly="false" other:xPath="zip_code" />
</rsb:info>
<rsb:set attr="URI" value="https://data.lacity.org/api/views/nxs9-385f/rows.xml" />
<rsb:set attr="RepeatElement" value="/response/row/row" />
<!-- GET メソッドは SELECT に対応します。 -->
<rsb:script method="GET">
<rsb:call op="xmlproviderGet">
<rsb:push/>
</rsb:call>
</rsb:script>
<!-- POST メソッドは INSERT に対応します。 -->
<rsb:script method="POST">
<rsb:set attr="method" value="POST"/>
<rsb:call op="xmlproviderGet">
<rsb:throw code="500" desc="Inserts are not currently supported."/>
<rsb:push/>
</rsb:call>
</rsb:script>
<!-- MERGE メソッドは UPDATE に対応します。 -->
<rsb:script method="MERGE">
<rsb:set attr="method" value="PUT"/>
<rsb:call op="xmlproviderGet">
<rsb:throw code="500" desc="Updates are not currently supported."/>
<rsb:push/>
</rsb:call>
</rsb:script>
<!-- DELETE メソッドは DELETE に対応します。 -->
<rsb:script method="DELETE">
<rsb:set attr="method" value="DELETE"/>
<rsb:call op="xmlproviderGet">
<rsb:throw code="500" desc="Deletes are not currently supported."/>
<rsb:push/>
</rsb:call>
</rsb:script>
</rsb:script>
スキーマ定義にはいくつかの異なる部分があります。テーブルとカラムの定義から、公開する REST リソースに基づく特定の設定、異なる CRUD(作成、読み取り、更新、削除)操作の処理定義まで。これらの部分について以下で説明します:
テーブル名と説明
<rsb:info title="LACensusData2010" desc="2010 Census data for the city of Los Angeles, grouped by ZIP code." xmlns:other="http://www.rssbus.com/ns/rsbscript/2/other">
rsb:info 要素にはテーブル定義が含まれ、2 つの重要な属性があります:title はテーブルまたはビューの名前、desc はテーブルまたはビューの説明です。これらの値により、一般的な BI、レポート、ETL ツールで公開される情報が決まります。
カラム定義
rsb:info 要素の attr 子要素は、テーブルまたはビューのカラム定義を表します。 以下は、カラム定義の詳細な説明です。...
<attr name="ID" xs:type="integer" readonly="false" other:xPath="@_id" />
...
各要素には、カラムに関する情報を提供するいくつかの属性があります:
- name:カラムの名前を指定します。SQL クエリの射影で使用され、REST リソースを操作する際に一般的な BI、レポート、ETL ツールで公開されます
- xs:type:カラムの SQL データ型を指定します
- readonly:カラムが読み取り専用かどうかを示し、デフォルトは "false" です
- other:xPath:XPath 記法を使用してカラムの値を解析する方法を設定します(詳細は以下)
REST リソース URI
<rsb:set attr="URI" value="https://data.lacity.org/api/views/nxs9-385f/rows.xml" />
RSBScript の rsb:set キーワードは、ドライバーで使用するプロパティを設定します。テーブルの REST リソースのファイルまたはエンドポイントを指定するには、attr および value XML 属性をそれぞれ "URI" とリソースの URI に設定します。この値は接続文字列で設定された値を上書きするため、各スキーマを異なる REST リソースに向けるように設定できます。
繰り返し要素
<rsb:set attr="RepeatElement" value="/response/row/row" />
このスキーマの XPath を定義するには、attr 属性を "RepeatElement" に設定し、value 属性を REST リソースを複数行に分割するために使用する XML 要素に設定します。スキーマ定義で RepeatElement 属性を設定すると、XPath 接続プロパティで設定された値が上書きされます。
XPath の詳細
REST ドライバーを設定するために使用されるいくつかのプロパティと属性は、XPath 記法を使用します。XPath 接続プロパティとカスタムスキーマの RepeatElement 属性では、XPath 値はデータを行に分割する XML 要素を定義します。カラム定義の other:xPath 属性は、カラム値として公開する XML 属性または子要素を正確に定義し、絶対パスまたは相対パス(XPath または RepeatElement に対して)を指定できます。
例えば、上記の XML データを使用する場合、Id カラムの other:xPath 属性を絶対パス /response/row/row@_id または相対パス @_id を使用して定義します。@ 文字は、値が XML 要素ではなく XML 属性から解析されることを示すことに注意してください。
繰り返される XML 要素の直接の子要素の値を公開する場合は、other:xPath 属性を省略できます。デフォルトでは、ドライバーは name 属性と同じ名前の要素を解析しようとします。例えば、ZIPCode カラムのカラム定義は次のように簡単にできます:
<attr name="ZIPCode" xs:type="integer" />
CRUD 操作の定義
上記のスキーマは HTTP GET 操作(SELECT)の動作を定義していますが、HTTP POST(SQL INSERT)、MERGE(SQL UPDATE)、DELETE(SQL DELETE)操作ではエラーをスローし、これらの操作が現在サポートされていないことを示します。読み取り専用の REST リソースを使用している場合、または統合を読み取り専用にしたい場合は、INSERT、UPDATE、DELETE の rsb:script キーワードを削除してください。これにより、BI、レポート、ETL ツールは公開されたリソースをテーブルではなく SQL ビューとして扱います。
RSBScript を使用して、各操作の動作をカスタマイズできます。SQL クエリで見つかったカラムと値に基づいて URL パラメータを追加する(REST リソースでサポートされている場合、通常は SELECT および DELETE リクエストに使用)ことから、INSERT および UPDATE リクエストをサポートするための PUT および POST データの構築まで可能です。
サンプル操作の実装
以下の実装は、REST リソースの完全な CRUD サポートを実装する方法の例です。(この記事のサンプル REST リソースは書き込み操作をサポートしていないことに注意してください。)特定のリクエストの実装の詳細については、オンラインヘルプドキュメントの REST データのモデル化セクションを参照してください。
- SELECT * FROM LACensusData2010 WHERE ([ZIPCode] = 90005)
このような SELECT クエリには、WHERE 句に条件が含まれることがよくあります。REST リソースに同じ種類の検索条件を実装するには、以下のような RSBScript を使用して GET メソッドを定義し、REST リソースの URI プロパティに URL パラメータとして条件を追加します。
<rsb:script method="GET"> <rsb:check attr="_input.ZIPCode"> <rsb:set attr="uri" value="[uri]?zip_code=[_input.ZIPCode]"/> </rsb:check> ... <rsb:call op="xmlproviderGet"> <rsb:push/> </rsb:call> </rsb:script> - INSERT INTO LACensusData2010 (MedianAge, TotalFemales, ...) VALUES (25.5, 3587, ...)
この INSERT クエリには、XML リソースに追加される新しいデータが含まれています。INSERT クエリを実装するには、以下のような RSBScript を使用して POST メソッドを定義し、HTTP POST データとして使用する XML データを構築します。
<rsb:script method="POST"> <rsb:set attr=method value="POST"/> <rsb:validate attr="_input.MedianAge" desc="median_age is required to INSERT" /> <rsb:validate attr="_input.TotalFemales" desc="total_females are required to INSERT" /> ... <rsb:set attr="data"> <row> <median_age>[_input.MedianAge]</median_age> <total_females>[_input.TotalFemales]</total_females> ... </row> </rsb:set> <rsb:call op="xmlproviderGet"/> </rsb:script> - UPDATE LACensusData2010 SET [MedianAge] = 25.5 WHERE [Id] = 57
この UPDATE クエリには、XML リソースに追加される新しいデータが含まれています。UPDATE クエリを実装するには、以下のような RSBScript を使用して POST メソッドを定義し、HTTP PUT データとして使用する XML データを構築します。
<rsb:script method="MERGE"> <rsb:set attr=method value="PUT"/> <rsb:validate attr="_input.ID" desc="id is required to UPDATE" /> <rsb:set attr="uri" value="[uri]([_input.ID])" /> <rsb:set attr="data"> <row> <rsb:check attr="_input.MedianAge"> <median_age>[_input.MedianAge]</median_age> </rsb:check> ... </row> </rsb:set> <rsb:call op="xmlproviderGet"/> </rsb:script> - DELETE FROM LACensusData2010 WHERE [Id]='57'
この DELETE クエリには、削除される XML リソース内のエントリの Id が含まれています。DELETE クエリを実装するには、以下のような RSBScript を使用して DELETE メソッドを定義します。
<rsb:script method="DELETE"> <rsb:set attr=method value="DELETE"/> <rsb:validate attr="_input.Id" desc="Id is required to UPDATE" /> <rsb:set attr="uri" value="[uri]([_input.Id])" /> <rsb:call op="xmlproviderGet"/> </rsb:script>
はじめに
CData REST ドライバーを使用すると、REST リソースをデータベースのように簡単に操作できます。REST リクエストの複雑さを、JDBC、ODBC、ADO.NET などの一般的なテクノロジーで使い慣れた SQL に置き換えることができます。いずれかのドライバーの 無料 30 日間トライアルをダウンロードして、今すぐ BI、レポート、ETL、カスタムアプリケーションで REST リソースを活用しましょう。ご不明な点がございましたら、サポートチームまでお気軽にお問い合わせください。