SQLおよびGETを使ってREST Webサービスを利用する
Webサービスの利用が業界内で拡大し続けていますが、IBM iでそうしたWebサービスを使用する方法に関する情報を見つけることは、時として難しいことがあります。では、Webサービスとはどのようなものでしょうか。簡単に言えば、Webサービスは、システムがJSONやXMLなどのファイル フォーマットを使用してWeb経由で通信することを可能にします。 この記事では、SQLを使ってREST Webサービスを利用する方法について説明します。ここで使用する例では、「GET」動詞を使ってAmazon Web Service(AWS)から情報を取得します。ペット ストア データベースからペットに関する情報を取得するシンプルなREST Amazon Web Serviceを作成してあり、ペットIDを渡すと、このサービスはペットID、ペットの種類、および価格を返します。このペット ストアWebサービスを利用したときに予期される結果は、次のようになります。

このWebサービスはJSONの表を返すため、その結果を解析し、DB2の表に書き込んで表示できるようにします。それでは、コードの各部分について見て行きましょう。 この記事で使用されているコードは、ここからダウンロードできます。 まず、WebサービスのURLを保持する変数に値を設定します。URLの最後の「1」は、問い合わせるペットID(1)です。 // これは、プログラムに渡されるソフトコーディングされたパラメーターとなります。

このWebサービスはJSONの表を返すため、その結果を解析し、DB2の表に書き込んで表示できるようにします。それでは、コードの各部分について見て行きましょう。 この記事で使用されているコードは、ここからダウンロードできます。 まず、WebサービスのURLを保持する変数に値を設定します。URLの最後の「1」は、問い合わせるペットID(1)です。 // これは、プログラムに渡されるソフトコーディングされたパラメーターとなります。

ここまでは簡単だったのではないでしょうか。面白くなるのはここからです。以下のコード部分が処理の大部分を行います。まずルーチン全体を示し、その後で各部分を見て行きます。

// 解析したJSONデータをdb2の表へ挿入します。

カーソルを宣言してから、HTTPGETCLOB関数を使ってSQLステートメントを実行してRESTサービスを利用します。JSON_TABLE関数は、サービスから返された結果を解析します。

HTTPGETCLOB関数には、WebサービスのURLとHeaderの2つのパラメーターを渡します。この例では、Headerデータを渡す必要はないため、Headerパラメーターはブランクです。URLの値はすでに設定してあり、変数 WebServiceUrl に格納されています。HTTPGETCLOBは、HTTP経由でREST Webサービスを利用できるようにする、IBM iで使用可能な数多くのユーザー定義関数(UDF)のうちの1つです。
JSON_TABLE関数は、JSON(JavaScript Object Notation)オブジェクトをリレーショナル フォーマットへ分解します。受け取ろうとしているJSONオブジェクトの列およびデータ型と、JSONオブジェクト内での情報を見つけられる場所のパスを定義します。要は、JSONオブジェクトに格納されているデータの見つけ方を指示するということです。
この例で与えられている指示について見てみましょう。「$」は、この関数に現行JSONオブジェクトから開始するよう指示します。次に、JSONオブジェクトに格納される列のフィールドおよびデータ型を定義します。最後に、データ要素へのパスを指定します。この例では、サービスで定義されている実際の列名を参照するように指示します。パス式(たとえば'lax $.id')内のピリオドは、 idの列内を参照するように指示します。それでは、「lax」というのは何者でしょうか。SQL/JSONパス式には、式に関連付けられているモードがあります。モードは、lax(寛容)モードまたはstrict(厳格)モードのいずれかになります。「lax」モード使用時には、SQL/JSONパス式の評価の際に一定のエラー条件は許容されます。「strict」モード使用時には、エラー条件が許容される ことはなく 、失敗になります。
次のコード部分は、サービスから返された結果を読み取ります。

// エラー処理を実行します。

カーソルを開いて読み取り、個々のフィールドを処理するデータ構造へ取り出します。すべての行を読み取ったら、カーソルが閉じられます。データ構造は次のようになります。

最後のコード部分は、Webサービスから取得したデータ要素をDB2の表へ挿入します。 // 解析されたJSONデータをdb2の表へ挿入します。

プログラム実行後、ACSを使用してDB2の表に保存された結果を表示し、予期した結果と返された結果が一致するか確認します。

この記事では、HTTPGETCLOBというUDFを使って、SQLを使用してRESTサービスを利用する方法について説明しました。前述のように、この他にも使用可能なUDFは数多くあります。今後の記事では、HTTPPOSTCLOBというUDFを使って、HeaderおよびBodyの両方を送信してRESTサービスを利用する方法について説明する予定です。