關於 RESTful Web Service Using JSON 範例

RESTful Web Service Using JSON 範例示範如何使用 IBM Integration Bus 中所提供的某些 JSON 剖析器特性。 該範例針對 WebSphere MQ 應用程式使用 REST 介面。 WebSphere MQ 應用程式使用 XML 訊息來管理光碟 (CD) 資料清單。

訊息流程

此範例是由三個主要元件所組成。

針對每個訊息流程,同名的測試用戶端會驅動該流程。

提供者訊息流程

下圖顯示「JSONRESTSample 整合」專案中此範例的 Web 服務提供者結構,即 HttpJsonRestProvider.msgflow

RESTful Web Service Using JSON 範例提供者訊息流程的畫面擷取

區段 A

HTTPInput 節點 HTTP JSON Input 會接聽訊息並已選取剖析查詢字串內容。 如果要求 URI 包含查詢字串(由 JSONP 使用),則查詢字串會儲存在區域環境中。HTTPInput 節點同時已選取設定目的地清單內容,從而可將 HTTP 方法新增至 RouteToLabel 節點之 RouteTo REST 方法中的標籤目的地清單路徑。該標籤目的地清單路徑稍後將在訊息流程中使用。

下一個節點是 Compute 節點,即 StoreHttpReqId。此 Compute 節點會儲存從要求 URI 的最後一部分擷取的目標。 例如,http://localhost:7080/jsonrequest/target。此 Compute 節點還會儲存 HTTP 要求 ID。 目標及 HTTP 要求 ID 儲存在「環境」中,以便稍後在流程中使用。

區段 B

視輸入訊息的 HTTP 方法而定,會將訊息傳遞至 JavaCompute 節點或 Compute 節點。

雖然這些節點的功能不相上下,但它們示範如何存取 JSON 樹狀結構,以及如何使用 Java 或 ESQL 將訊息轉換為另一種資料格式 (XML)。

如需使用不同的語言(包括 PHP)存取 JSON 的相關資訊,請參閱 IBM Integration Bus 文件中的修改 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 會將要求 ID 儲存在區域環境中,從而可供 HTTP Reply 節點 HTTP JSON Reply 使用。 如果原始 HTTP 要求包含查詢字串,則該查詢字串在 JSONP 訊息中將用作填補值。

如需提供及耗用 JSONP 服務的相關資訊,請參閱 IBM Integration Bus 文件中的 JSON 網域中的 JSONP 支援

消費者訊息流程

此範例包含兩個可耗用 Web 服務及 JSONP 消費者訊息流程的單獨訊息流程。

WebSphere MQ JSON 消費者

第一個訊息流程(即 MqJsonClientConsumer.msgflow)使用 JSON over WebSphere MQ,並顯示如何透過使用特定輸入佇列定義 REST 方法,從 WebSphere MQ 呼叫 HTTP REST 服務。

JSON 消費者訊息流程的畫面擷取。

此訊息流程包含四個 MQInput 節點;每個 REST 方法各一個:

Compute 節點 BuildRestRequest 從這些佇列取得訊息,並建置一個要求以傳送至 RESTful 服務。 根據 REST 架構,此 Compute 節點還會利用要求所操作的物件名稱延伸目標 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 消費者

第二個訊息流程(即 MqXmlClientConsumer.msgflow)顯示如何耗用來自 WebSphere MQ XML 用戶端的 HTTP RESTful JSON 服務,如何將 XML 轉換為 JSON,以及如何呼叫適當的 REST 方法。

XML 消費者訊息流程的畫面擷取。

此訊息流程包含傳遞所有 REST 方法所使用的單一 MQInput 節點 MQ Input (XML_CONS_IN1)。 由於 Web 服務需要 JSON 訊息,因此 Compute 節點 XML-JSON 與 JSON-XML 會適當地將訊息從 XML 轉換為 JSON,以及從 JSON 轉換為 XML。

XML-JSON Compute 節點執行的作業與「WebSphere MQ JSON 消費者」區段中所述的 BuildRestRequest Compute 節點的類似。 但是,僅使用一個佇列,而不是針對每種 HTTP 方法使用不同的佇列,並且要使用的 HTTP 方法類型會作為一個值儲存在 XML 訊息中。 此節點還會透過下列程式碼將成員元素設為 JSON 陣列:

SET OutputRoot.JSON.Data = InputRoot.XMLNSC.Collection.CD;
DECLARE membersArray REFERENCE TO OutputRoot.JSON.Data.Members;
IF LASTMOVE(membersArray) THEN
	-- 將「成員」元素格式化為「JSON 陣列」
	SET  membersArray TYPE = JSON.Array;
END IF;

如需使用不同的語言(包括 Java 與 PHP)修改及轉換 JSON 訊息的相關資訊,請參閱 IBM Integration Bus 文件中的修改 JSON 訊息

JSONP 消費者

「JSONP 消費者」是使用 JavaScript 直接存取提供者的一種 Web 前端系統。下圖顯示 JSONPConsumer.html 中 JavaScript 的結果:

JSONP Script 的畫面擷取。

您可以透過修改下列 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 的相關資訊,請參閱 IBM Integration Bus 文件中的提供 JSONP 服務耗用 JSONP 服務回應


後端應用程式訊息流程

下圖顯示後端 WebSphere MQ 應用程式訊息流程(即 MqXmlApp.msgflow):

後端 WebSphere MQ 應用程式的畫面擷取。

此流程包含 MQInput 節點 MQ XML Input (APP_IN1) 及 Compute 節點 Application,從而在其第一次執行時起始設定範例資料。 此資料儲存在期限較長的變數中,在部署流程期間會持續保存。 視 XML 訊息的內容而定,Compute 節點還會針對此資料執行建立、擷取、更新或刪除 (CRUD) 功能。 最後,訊息會延伸至 MQOutput 節點 MQ XML Output (APP_OUT1) 上的 WebSphere MQ 佇列(即 APP_OUT1)。

訊息

消費者訊息流程由 WebSphere MQ 訊息所驅動。 提供的測試用戶端檔案可利用下列訊息來執行範例:

擷取

當將下列訊息傳送至 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"]
}

回到範例首頁