RESTful Web Service Using JSON サンプルについて

RESTful Web Service Using JSON サンプルは、WebSphere Message Broker が備えている JSON パーサーのいくつかの機能の使用方法を示します。 このサンプルでは、WebSphere MQ アプリケーションに REST インターフェースが使用されます。 WebSphere MQ アプリケーションでは、コンパクト・ディスク (CD) データのリストを管理するのに XML メッセージが使用されます。

メッセージ・フロー

このサンプルは、3 つの主要コンポーネントで構成されています。

メッセージ・フローごとに、同じ名前のテスト・クライアントがそのフローを駆動します。

プロバイダー・メッセージ・フロー

下の図は、JSONRESTSample メッセージ・ブローカー・プロジェクト内における、このサンプルの Web サービス・プロバイダー HttpJsonRestProvider.msgflow の構造を示しています。

RESTful Web Service Using JSON サンプルのプロバイダー・メッセージ・フローの画面取り。

セクション A

HTTP JSON Input という HTTPInput ノードは、メッセージを listen し、「照会ストリングの構文解析」プロパティーが選択されています。 要求 URI に照会ストリング (JSONP で使用される) が含まれている場合、その照会ストリングはローカル環境に保管されます。 HTTPInput ノードでは、「宛先リストを設定」プロパティーも選択されています。 これは、HTTP メソッドを、RouteToLabel ノード、RouteTo REST メソッドのラベル宛先リストのルートに追加するものです。 ラベル宛先リストのルートは、後でメッセージ・フローの中で使用されます。

次のノードは Compute ノード StoreHttpReqId です。 この Compute ノードは、ターゲットを保存します。 ターゲットは、要求 URI の最後の部分から抽出されます。 例えば、http://localhost:7080/jsonrequest/target です。 この Compute ノードは、HTTP 要求 ID も保存します。 ターゲットと HTTP 要求 ID は Environment に保存され、後でフローにおいて使用されます。

セクション B

入力メッセージの HTTP メソッドに応じて、メッセージは JavaCompute ノードか Compute ノードのいずれかに渡されます。

これらのノードの機能は類似していますが、 JSON ツリーにアクセスする方法、および Java または ESQL を使用して別のデータ形式 (XML) にメッセージを変換する方法を示します。

PHP を含む別の言語を使用して JSON にアクセスする方法について詳しくは、WebSphere Message Broker の資料の JSON メッセージの変更を参照してください。

セクション C

メッセージは次に、バックエンド WebSphere MQ アプリケーションによって処理されるキューに入れられます。 バックエンド WebSphere MQ アプリケーションには、MQOutput ノードの MQOutput (APP_IN1) が含まれ、メッセージを Compute ノードの WriteHttpReqId に送ります。 WriteHttpReqId Compute ノードは、メッセージ・フローで前に作成されたローカル環境変数を含むメッセージを作成します。 MQHeader ノードの MQ Header は、MQOutput ノードの MQOutput (STOREQ1) を使用することにより、この新しいメッセージをキュー STOREQ1 に入れます。

セクション D

MQInput ノードの MQInput (APP_OUT1) は、メッセージを WebSphere MQ アプリケーションから取り出します。 MQGet ノードの MQGet (STOREQ1) は、関連するメッセージをキュー STOREQ1 から取り出します。 エラーが発生した場合、Throw ノードの ThrowRestoreHttpReqIdError によりキャッチされます。このノードは、メッセージの内容に予期しないデータが含まれる場合に、メッセージ・フローを通してエラー・パスを強制するときに使用されます。 Compute ノード JSON Reply は、HTTP Reply ノードの HTTP JSON Reply によって使用されるローカル環境に要求 ID を保管します。 オリジナルの HTTP 要求に照会ストリングが含まれている場合、その照会ストリングは JSONP メッセージで埋め込み値として使用されます。

JSONP サービスの提供および消費について詳しくは、WebSphere Message Broker の資料の JSON ドメインでの JSONP のサポートを参照してください。

コンシューマー・メッセージ・フロー

このサンプルには、Web サービスおよび JSONP コンシューマー・メッセージ・フローを利用できる 2 つの別個のメッセージ・フローが含まれています。

WebSphere MQ JSON コンシューマー

第 1 のメッセージ・フロー MqJsonClientConsumer.msgflow は、WebSphere MQ に対して JSON を使用し、特定の入力キューを使用して WebSphere MQ から HTTP REST サービスを呼び出すことにより REST メソッド定義する方法を示します。

JSON コンシューマー・メッセージ・フローの画面取り。

このメッセージ・フローには、REST メソッドのそれぞれについて 1 つずつ、合計 4 つの MQInput ノードが含まれています。

Compute ノードの BuildRestRequest は、これらのキューからメッセージを取得し、RESTful サービスに送信する要求を作成します。 さらにこの Compute ノードは、REST アーキテクチャーに沿って、要求の対象となるオブジェクトの名前を付加してターゲット URL を拡張します。 このノードの「計算モード」プロパティーは「LocalEnvironment とメッセージ」に設定されているため、ローカル環境に保管されるターゲット URL と HTTP メソッドは、メッセージ・フローを通じて渡されることになります。

HTTPRequest ノードの HTTP REST Request は、メッセージを RESTful サービスに渡します。 RESTful サービスから返されるメッセージは、呼び出されているメソッドによって異なります。

次に Compute ノードの RestoreMQMD が、MQMD ヘッダーを出力メッセージに復元し、MQOutput ノードの MQ Output (JSON_REPLY1) を使用して、それをキュー JSON_REPLY1 に送ります。


JSON REST サービスのための WebSphere MQ XML コンシューマー

第 2 のメッセージ・フロー MqXmlClientConsumer.msgflow は、WebSphere MQ XML クライアントから HTTP RESTful JSON サービスを消費する方法、XML を JSON に変換する方法、および該当する REST メソッド呼び出しの実行方法を示します。

XML コンシューマー・メッセージ・フローの画面取り。

このメッセージ・フローに含まれるのは単一の MQInput ノードの MQ Input (XML_CONS_IN1) であり、すべての REST メソッドはそれを通ることになります。 Web サービスで JSON メッセージが必要であるため、Compute ノードの XML-JSON および JSON-XML は、XML から JSON、および JSON から XML のうち該当する方向にメッセージを変換します。

XML-JSON Compute ノードは、WebSphere MQ JSON コンシューマーのセクションで記述されている BuildRestRequest Compute ノードと類似のタスクを実行します。 ただし、HTTP メソッドごとに異なるキューを使用するのではなく、使用されるキューは 1 つだけであり、使用される HTTP メソッドのタイプは XML メッセージ中の値として保管されます。 また、このノードでは、以下のコードにより、メンバー・エレメントを JSON 配列として設定します。

SET OutputRoot.JSON.Data = InputRoot.XMLNSC.Collection.CD;
DECLARE membersArray REFERENCE TO OutputRoot.JSON.Data.Members;
IF LASTMOVE(membersArray) THEN
	-- Format the Members element as a JSON Array
	SET  membersArray TYPE = JSON.Array;
END IF;

Java および PHP を含む別の言語を使用して JSON メッセージを変更および変換する方法について詳しくは、WebSphere Message Broker の資料の JSON メッセージの変更を参照してください。

JSONP コンシューマー

JSONP コンシューマーは、JavaScript を使用してプロバイダーに直接アクセスする Web フロントエンドです。 JSONPConsumer.html 中に生成される JavaScript の結果を、以下の図に示します。

JSONP スクリプトの画面取り。

以下の HTML JavaScript タグを修正することにより、照会を変更できます。

<script type="text/javascript" src="http://localhost:7080/jsonrequest/*?jsonp=parseResponse"></script>
例えば、照会を次のコードに変更すると、タイトルが "IX" の CD が返されます。
<script type="text/javascript" src="http://localhost:7080/jsonrequest/IX?jsonp=parseResponse"></script>

JSONP について詳しくは、WebSphere Message Broker の資料の JSONP サービスの提供および JSONP サービスの応答の消費を参照してください。


バックエンド・アプリケーション・メッセージ・フロー

下の図は、バックエンド WebSphere MQ アプリケーション・メッセージ・フロー MqXmlApp.msgflow を示しています。

バックエンド MQ アプリケーションの画面取り。

このフローには、MQInput ノードの MQ XML Input (APP_IN1)、および Compute ノードの Application が含まれ、最初の実行時にサンプル・データを初期化します。 このデータは長存続期間変数に保管されます。 その変数は、フローがデプロイされている期間にわたって持続します。 また、この Compute ノードは、XML メッセージの内容に応じて、このデータに対し、作成、取得、更新、または削除 (CRUD) 機能を実行します。 最後に、MQOutput ノードの MQ XML Output (APP_OUT1) 上の WebSphere MQ キューの APP_OUT1 にメッセージが伝搬されます。

メッセージ

コンシューマー・メッセージ・フローは WebSphere MQ メッセージ・ドリブンです。 以下のメッセージを使用してサンプルを実行するためのテスト・クライアント・ファイルが用意されています。

Retrieve

次のメッセージが RETRIEVE_IN1 キューに送られると、すべての CD に関するデータが返されます。

{
 "Title" : "*"
}

次のメッセージが RETRIEVE_IN1 キューに送られると、"Friars Ball" というタイトルの CD に関する CD データが返されます。

{
 "Title" : "Friars Ball"
}

上記のメッセージの両方で、以下の形式のメッセージが返されます。

{"Title":"Friars Ball","Artist":"Deep Blue","Country":"UK","Price":"9.90","Year":"1971","Members":
["Liam Gillan","Alan Blackmore","Phil Glover","David Paice","Tom Lord"]}

削除

次の JSON メッセージが DELETE_IN1 キューに送られると、"Friars Ball" というタイトルの CD に関するデータが削除されます。

{
 "Title" : "Friars Ball"
}

処理が正常に実行されると、以下のメッセージが返されます。

{"Status":"Success"}

作成と更新

次のメッセージが UPDATE_IN1 キューに送られると、"Friars Ball" というタイトルの CD に関するデータが変更されます。更新されたレコードのみが返されます。メッセージが CREATE_IN1 キューに送られた場合は、完全に新しい項目が作成されます。新しい項目を含め、すべてのデータが返されます。

{
 "Title" : "Friars Ball",
  "Artist" : "Deep Orange",
  "Country" : "United Kingdom",
  "Price" : 19.90,
  "Year"  : 2010,
  "Members":["Liam Gillan","Alan Blackmore","Phil Glover","David Paice","Tom Lord"]
}

サンプルのホームに戻る