SQLおよびPOSTを使ってREST Webサービスを利用する
前回の記事では、GET動詞を使ってREST Webサービスを利用する方法について説明しました。今回の記事では、POST動詞を使用することを通じてWebサービスについてのさらなる知識を蓄えてゆこうと思います。また、前回とは別の動詞を使用するというだけでなく、ヘッダーとボディをWebサービスへ渡す方法についても説明します。
ゴールは、Amazon Web Service(AWS)へ情報を投稿することです。シンプルなREST Amazon Web Serviceを作成してあり、このWebサービスはペット ストア データベースに挿入されるペットについての情報を受け入れます。このWebサービスには、ペットの種類および価格が格納されたJSON構造を渡します。JSON構造のフォーマットは、次のようになります。

リクエストが成功すると、Webサービスへ渡された情報と"success"メッセージが入った、次のようなJSON応答を受け取ります。

このサービスはJSONの表を返すため、その結果を解析し、DB2の表に書き込んで表示できるようにします。それでは、コードの各部分について見て行きましょう。 この記事で使用されているコードは、 ここからダウンロードできます。 まず、Webサービスによって必要とされる3つの変数に値を設定します。
- WebサービスのURL。
- 渡される必要があるHeader。この例では、送信されるコンテンツがJSONオブジェクトであることを示します。
- 渡される必要があるBody。このWebサービスは、ペットの種類および価格が格納されたJSONオブジェクトが渡されることを予期します。
// これらは、プログラムに渡されるソフトコーディングされたパラメーターとなります。

次に、Webサービスからの結果を保存するDB2の表をクリアして、最新のサービスの呼出しからの結果だけになるようにしておきます。
// Webサービスを利用する前に出力表をクリアします。

準備作業が終了したら、いよいよWebサービスを利用します。その処理を行うのが、以下のコード部分です。まずルーチン全体を示し、その後で各部分を見て行きます。

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

HTTPPOSTCLOB関数には、WebサービスのURL、Header、Bodyの3つのパラメーターを渡します。 JSON_TABLE関数について細かく見て行きましょう。この関数は、サービスからの結果を解析するのに使用します。JSON_TABLE関数は、JSONオブジェクトをリレーショナル フォーマットへ分解します。受け取ろうとしているJSONオブジェクトの列およびデータ型と、JSONオブジェクト内での情報を見つけられる場所のパスを定義します。要は、JSONオブジェクトに格納されているデータの見つけ方を指示するということです。
この例で与えられている指示について見てみましょう。'$'は、この関数に現行JSONオブジェクトから開始するよう指示します。次に、JSONオブジェクトに格納される列のフィールドおよびデータ型を定義します。最後に、データ要素へのパスを指定します。このステートメントで2つの列のセットを定義した点に注目してください。返されるメッセージは、直接、トップレベルJSONオブジェクトに置かれます。パス式(たとえば'lax $.message')内のピリオドは、 messageの列内を参照するように指示します。しかし、ペットの種類および価格は、 petという名前の配列内にあります。これをネストされたパスとして定義し、JSONオブジェクト('$'によって示される)を、そして配列 pet ('pet[*]')の中を('.')参照するように指示します。説明が必要な最後のコード部分は、「 lax」という用語です。SQL/JSONパス式には、式に関連付けられているモードがあります。モードは、lax(寛容)モードまたはstrict(厳格)モードのいずれかになります。「lax」モード使用時には、SQL/JSONパス式の評価の際に一定のエラー条件は許容されます。「strict」モード使用時には、エラー条件が許容される ことはなく 、失敗になります。
次のコード部分は、サービスから返された結果を読み取ります。

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

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

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

Webサービスの必要性が高まるにつれて、それらの使い方について学ぶことは非常に重要になっています。この記事ではRESTサービスおよびJSONオブジェクトに焦点を当てました。それが、業界のトレンドであるように思われるためです。また、少し踏み込んで、Webサービスにヘッダーおよびボディ情報を渡す方法についても説明しました。Webサービスは、最初は取っ掛かりにくいかもしれませんが、この記事によって少しでも簡単になるのだとしたら幸いです。