使用 JSON 样本的 RESTful Web Service 演示了如何使用 IBM Integration Bus 中提供的某些 JSON 解析器功能部件。 此样本使用 WebSphere MQ 应用程序的 REST 接口。 WebSphere MQ 应用程序使用 XML 消息来管理光盘 (CD) 数据列表。
此样本含有三个主要组件。
对于每个消息流,同一名称的测试客户机会驱动该流。
下图显示了 Integration 项目 JSONRESTSample 中针对此样本的 Web Service 提供程序 HttpJsonRestProvider.msgflow 的结构。

HTTPInput 节点 (HTTP JSON Input) 用于侦听消息,并且会选中解析查询字符串属性。 如果请求 URI 含有查询字符串(供 JSONP 使用),那么查询字符串会存储在本地环境中。HTTPInput 节点还会选中设置目标列表属性,这会在 RouteToLabel 节点中将 HTTP 方法(RouteTo REST 方法)添加到标签目标列表的路径中。稍后将在消息流中使用标签目标列表的路径。
下一个节点是 Compute 节点 (StoreHttpReqId)。此 Compute 节点会保存从请求 URI 的最后一部分中抽取出的目标。 例如,http://localhost:7080/jsonrequest/target。此 Compute 节点还会保存 HTTP 请求标识。 目标和 HTTP 请求标识会保存在环境中,以备稍后在流中使用。
根据输入消息的 HTTP 方法,将此消息传递至 JavaCompute 节点或 Compute 节点。
虽然这些节点的函数可进行比较,这些函数可使用 Java 或 ESQL 来演示如何访问 JSON 树,以及如何将消息转换为另一个数据格式 (XML)。
有关使用不同语言(包括 PHP)来访问 JSON 的更多信息,请参阅 IBM Integration Bus 文档中的修改 JSON 消息。
接着,会将消息放入由后端 WebSphere MQ 应用程序处理的队列中。 后端 WebSphere MQ 应用程序含有向 Compute 节点 (WriteHttpReqId) 发送消息的 MQOutput 节点 (MQOutput (APP_IN1))。 WriteHttpReqId Compute 节点会构建一条消息,该消息含有先前在消息流中创建的本地环境变量。 MQHeader 节点 (MQ Header) 可使用 MQOutput 节点 (MQOutput (STOREQ1))将此新消息放入队列 STOREQ1 中。
MQInput 节点 (MQInput (APP_OUT1))会检索 WebSphere MQ 应用程序中的消息。 MQGet 节点 (MQGet (STOREQ1)) 会检索队列 (STOREQ1) 中的相关消息。 如果出现错误,Throw 节点 (ThrowRestoreHttpReqIdError) 会将其捕获,即如果消息内容含有意料之外的数据,那么会使用 Throw 节点通过消息流强制错误路径。 Compute 节点 (JSON Reply) 会在本地环境中存储 HTTP Reply 节点 (HTTP JSON Reply) 所用的请求标识。 如果原始的 HTTP 请求含有查询字符串,该查询字符串将作为 JSONP 消息中的填充值。
有关提供和使用 JSONP 服务的更多信息,请参阅 IBM Integration Bus 文档中的 JSON 域中的 JSONP 支持。
此样本含有两个可使用 Web Service 和 JSONP 使用者消息流的独立消息流。
第一个消息流 MqJsonClientConsumer.msgflow 会通过 WebSphere MQ 使用 JSON,并会显示如何使用用于定义 REST 方法的特定输入队列来调用 WebSphere MQ 中的 HTTP REST 服务。
此消息流含有四个 MQInput 节点;每个节点有一个 REST 方法:
Compute 节点 (BuildRestRequest) 会采用这些队列中的消息,并会构建一个可发送至 RESTful 服务的请求。 根据 REST 体系结构,此 Compute 节点还可使用对请求起作用的对象名称来扩展目标 URL。 将此节点的 Compute Mode 属性设置为 LocalEnvironment And Message,从而可通过消息流传递存储在本地环境中的目标 URL 和 HTTP方法。
HTTPRequest 节点 (HTTP REST Request) 会将其消息传递至 RESTful 服务。 由 RESTful 服务返回的消息取决于正在调用的方法。
接着,Compute 节点 (RestoreMQMD) 会将 MQMD 头恢复到输出消息中,然后通过使用 MQOutput 节点 (MQ Output (JSON_REPLY1)) 将输出消息发送至 JSON_REPLY1 队列。
第二个消息流 MqXmlClientConsumer.msgflow 显示了如何从 WebSphere MQ XML 客户端使用 HTTP RESTful JSON 服务、如何将 XML 转换为 JSON,以及如何执行相应的 REST 方法调用。
此消息流含有一个 MQInput 节点 (MQ Input (XML_CONS_IN1)),所有 REST 方法可通过该节点进行传递。 因为 Web Service 需要 JSON 消息,Compute 节点(XML-JSON 和 JSON-XML)会对 XML 及 JSON 格式的消息相应地进行相互转换。
XML-JSON Compute 节点运行的任务与 WebSphere MQ JSON Consumer 章节中所述的 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 -- Format the Members element as a JSON Array SET membersArray TYPE = JSON.Array; END IF;
有关使用不同语言(包括 Java 和 PHP)来修改和变换 JSON 消息的更多信息,请参阅 IBM Integration Bus 文档中的修改 JSON 消息。
JSONP 使用者为 Web 前端,可用于使用 JavaScript 来直接访问提供程序。 下图显示了 JSONPConsumer.html 中 JavaScript 的结果:

可通过修改以下 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:

该流包含 MQInput 节点 (MQ XML Input (APP_IN1)) 和 Compute 节点 (Application),这些节点会在首次运行时对样本数据进行初始化。 此数据会存储在长期有效的变量中,在部署流期间将持久存储。 依据 XML 消息的内容,Compute 节点还会根据此数据执行 create、retrieve、update 或 delete (CRUD) 函数。 最后,在 MQOutput 节点 ( MQ XML Output (APP_OUT1)) 上将此消息传播到 WebSphere MQ 队列 (APP_OUT1) 中。
使用者消息流由 WebSphere MQ 消息驱动。 提供了测试客户机文件,该文件可通过使用以下消息来运行样本:
将以下消息发送至 RETRIEVE_IN1 队列后,将会返回所有 CD 的相关数据:
{
"Title" : "*"
}
将以下消息发送至 RETRIEVE_IN1 队列后,将会返回标题为"Friars Ball"的所有 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"]
}