多响应生成器是一个功能强大的工具,允许你轻松地处理分层数据场景、一对多异步消息传递等等。
在本章节中:
概要
对于一段 XML(input
),XML 元素名称(elementName
),和后端资产的 URL(backendURL
),多响应生成器在 input
中找到 elementName
的每次出现,并将其分别发送到 backendURL
。后端资产是一个虚拟资产,配置来响应以 elementName
作为根元素的消息,并将响应发送回多响应生成器。一旦获得这些响应,多响应生成器会将它们聚集到一个 XML 文档中,以便在响应中使用。
要求
- Parasoft Virtualize
安装指南
- 从 Parasoft 应用商店下载的存档中提取多响应生成器 JAR 文件。
- 从主菜单中打开并选择 Parasoft> Preferences> System Properties 。
- 单击 Add JARs… 并浏览到多响应生成器 JAR 文件。
- 单击 OK ,然后重启 Virtualize。
执行此设置后,你将发现工具列表中的多响应生成器工具可用于附加到消息响应程序。
配置
多响应生成器使用两组主要选项进行控制。Required 部分中的选项是多响应生成器运行所必需的,而 Optional 部分中的选项为高级场景提供了更细粒度的控制。
所需配置
必须配置以下选项,才能使多响应生成器正常工作。
要发送到后端资产的元素的名称 | XML 元素名称,如果适用,包含命名空间前缀。传入的 XML 中与此名称匹配的元素的每次出现都将被分割并发送到后端资产 URL 中指定的虚拟资产。此外,如果请求中存在多个列表,则此工具将创建所有列表元素的组合。如果要使用单个列表,请排除任何其他列表。 |
---|---|
后端资产 URL | 虚拟资产的 URL。虚拟资产应该有一个响应器来处理 XML 消息,其根元素是要发送到后端资产的元素名中定义的元素。 |
可选配置
分裂过程不包含的元素 | 以逗号分割的元素名称列表,如果适用,包含命名空间前缀。默认情况下,如果要发送到后端资产选项的元素名称汇总指定的 XML 包含任何具有相同名称的兄弟元素(比如,列表),则多响应生成器将为兄弟元素的每次重复创建一个单独的请求。 |
---|---|
相应类型 | 如果 Backend Asset URL 中指定的虚拟资产返回 XML,则将该字段保留为空。如果 Backend Asset URL 中指定的虚拟资产返回非 XML 格式的负荷,则输入 Other。 |
输出 XML 根标签名称 | 响应 XML 输出的根标签名称。默认为“responses”。 |
输出 XML | 输出 XML 根标签名称的子元素名称。默认为“response”。 |
SOAPAction 列表 | 对于以逗号分割的列表中指定的每个 SOAPAction,要发送给后端资产的元素名称中指定的元素的每次出现都将使用该 SOAPAction 发送到 Backend Asset URL。如果每个元素出现都需要多个响应,则这一点非常有用。 |
使用说明
多响应生成器可被附加到 Parasoft Virtualize 消息响应程序的任何 XML 输出中。这包含任何基于 XML 的响应程序的 Incoming Request > Payload ,或任何不是基于 XML 的响应程序的 Incoming Request > Payload Converted to XML 。下面描述了使用多响应生成器的基本过程。 Example Scenarios中提供了更详细的描述。
- 使用一个或多个响应程序创建一个前端资产。
- 对于需要资产的每个响应程序,将多响应生成器附加到消息响应程序的 Incoming Request> Payload 输出(如果响应程序将处理 XML 输入)或消息响应程序的 Incoming Request> Payload Converted to XML 输出(如果响应程序将处理非 XML 输出)。
- 使用至少一个 Name of element to send to backend asset 和 Backend Asset URL配置多响应生成器。
- 创建后端资产来处理多响应生成器将发送的消息。确保后端资产部署在多响应生成器中的 Backend Asset URL 中指定的 URL 上。
- 将 XML 数据库或文本数据库附加到多响应生成器的 Response XML 输出,并配置它以提取聚合的响应。
- 在响应中使用聚合的响应。
示例场景
虽然有许多场景可以由多个响应生成器处理,但本节将为使用最频繁的场景提供示例。
处理具有动态元素数量的列表
由多响应生成器处理的最常见场景是包含具有动态元素数量的列表的消息。例如:
<root> <items> <item> <name>Name1</name> <id>1</id> </item> <item> <name>Name2</name> <id>2</id> </item>
这个请求可以包含 N 子请求,其中 N>=1。我们期望的响应是这样的:
<root> <itemResponses> <itemResponse> <balance>10</balance> </itemResponse> <itemResponse> <balance>20</balance> </itemResponse>
使用 Usage中描述的流程,下面的说明有助于使用上述请求和响应设置资产。
- 使用一个或多个响应程序创建一个前端资产:
- 右键单击 VirtualAssets 项目,然后选择 Add New> Virtual Asset (.pva) File。
- Enter提示时,在 File Name 字段中输入
Example1-Frontend
,然后单击 Next。 - 在下一个屏幕上的选项列表中选择 Empty ,然后单击 Finish。
- 右键单击新创建的 Example1-Frontend.pva 中的 Responder Suite ,然后选择 Add New > Responder。
- 在出现的窗口中,选择 Literal Message Responder,然后单击 Finish
- 对于需要它的每个响应程序,将多响应生成器附加到消息响应程序的 Incoming Request> Payload 输出(如果响应程序将处理 XML 输入)或消息响应程序的 Incoming Request> Payload Converted to XML 输出(如果响应程序将处理非 XML 输出。
- 右键单击 Literal Message Responder ,然后选择 Add Output…
- 在出现的窗口中,在传入请求部分选择 Payload ,然后在常见工具下选择 Multiple Responses Generator 。
- 单击 Finish。
- 使用至少一个 Name of element to send to backend asset 和 Backend Asset URL配置多响应生成器。
- 在 要发送到后端资产的元素名称字段中,输入
item
。 - 在 Backend Asset URL 字段中,输入
http://localhost:9080/Example1-Backend
。 - 在 Optional 部分,输入
itemResponses
。 创建后端资产来处理多响应生成器将发送的消息。确保后端资产部署在多响应生成器中的 Backend Asset URL 中指定的 URL 上。
为了简单起见,我们将在后端使用固定响应。然而,从应用商店下载的归档中的 Example1-Backend.pva 使用动态响应。
- 在 要发送到后端资产的元素名称字段中,输入
- 右键单击 VirtualAssets 项目,然后选择 Add New> Virtual Asset (.pva) File。
- 提示时,在 File Name 字段中输入
Example1-Backend
,然后单击 Next。 - 在下一个屏幕上的选项列表中选择 Empty ,然后单击 Finish。
- 在新创建的 Example1-Backend.pva 中,右键单击 Responder Suite ,然后选择 Add New > Responder。
- 在下一个屏幕上选择 Literal Message Responder ,然后单击 Finish。
输入以下 XML:
<itemResponse> <balance>10</balance> </itemResponse>
- 将 XML 数据库或文本数据库附加到多响应生成器的响应 XML 输出,并配置它以提取聚合的响应。
- 在 Example1-Frontend.pva 中,右键单击 MultipleResponsesGenerator ,然后选择 Add output…
- 选择左侧的 Response XML ,然后选择右侧的 XML Data Bank 。
- 单击 Add XPath
- 单击 Selected XPaths 列中出现的行,然后单击 Modify。
- 将 Xpath 字段更改为
/*
- 从 Extract 下拉 菜单选择 Entire Element 。
- 在编辑器左侧选择 Data source column ,然后在 Custom column name 字段中输入响应。
- 然后单击 OK。
若要在响应中使用聚合的响应,则双击 Literal Message Responder ,并将以下内容输入至文本字段:
<root> ${responses} </root>
下图描述了完整的场景: