第 75 章 使用 KIE 服务器 REST API 执行测试场景
与 KIE 服务器的 REST 端点直接交互,提供调用代码和决策逻辑定义之间的最分离。您可以使用 KIE 服务器 REST API 在外部执行测试场景。它针对已部署的项目执行测试场景。
默认情况下禁用此功能,使用 org.kie.scenariosimulation.server.ext.disabled
系统属性启用它。
有关 KIE Server REST API 的更多信息,请参阅使用 KIE API 与 Red Hat Decision Manager 交互。
先决条件
-
KIE 服务器是安装和配置的,包括具有
kie-server
角色的用户的已知用户名和凭证。有关安装选项,请参阅 规划 Red Hat Decision Manager 安装。 - 您已将项目构建为 KJAR 工件并将其部署到 KIE 服务器。
- 您有 KIE 容器的 ID。
流程
确定用于访问 KIE 服务器 REST API 端点的基础 URL。这需要了解以下值(使用默认本地部署值作为示例):
-
主机(
本地主机
) -
端口(
8080
) -
根上下文(
kie-server
) -
基本 REST 路径(
services/rest/
)
流量违反项目的本地部署中的基本 URL 示例:
http://localhost:8080/kie-server/services/rest/server/containers/traffic_1.0.0-SNAPSHOT
-
主机(
确定用户身份验证要求。
当在 KIE 服务器配置中直接定义用户时,使用 HTTP 基本身份验证并需要用户名和密码。成功请求需要该用户具有
kie-server
角色。以下示例演示了如何在 curl 请求中添加凭证:
curl -u username:password <request>
如果使用 Red Hat Single Sign-On 配置 KIE 服务器,则请求必须包含 bearer 令牌:
curl -H "Authorization: bearer $TOKEN" <request>
指定请求和响应的格式。REST API 端点使用 XML 格式,并使用请求标头来设置:
XML
curl -H "accept: application/xml" -H "content-type: application/xml"
执行测试场景:
[POST]
server/containers/{containerId}/scesim
curl 请求示例:
curl -X POST "http://localhost:8080/kie-server/services/rest/server/containers/traffic_1.0.0-SNAPSHOT/scesim"\ -u 'wbadmin:wbadmin;' \ -H "accept: application/xml" -H "content-type: application/xml"\ -d @Violation.scesim
XML 请求示例:
<ScenarioSimulationModel version="1.8"> <simulation> <scesimModelDescriptor> <factMappings> <FactMapping> <expressionElements/> <expressionIdentifier> <name>Index</name> <type>OTHER</type> </expressionIdentifier> <factIdentifier> <name>#</name> <className>java.lang.Integer</className> </factIdentifier> <className>java.lang.Integer</className> <factAlias>#</factAlias> <factMappingValueType>NOT_EXPRESSION</factMappingValueType> <columnWidth>70.0</columnWidth> </FactMapping> <FactMapping> <expressionElements/> <expressionIdentifier> <name>Description</name> <type>OTHER</type> </expressionIdentifier> <factIdentifier> <name>Scenario description</name> <className>java.lang.String</className> </factIdentifier> <className>java.lang.String</className> <factAlias>Scenario description</factAlias> <factMappingValueType>NOT_EXPRESSION</factMappingValueType> <columnWidth>300.0</columnWidth> </FactMapping> <FactMapping> <expressionElements> <ExpressionElement> <step>Driver</step> </ExpressionElement> <ExpressionElement> <step>Points</step> </ExpressionElement> </expressionElements> <expressionIdentifier> <name>0|1</name> <type>GIVEN</type> </expressionIdentifier> <factIdentifier> <name>Driver</name> <className>Driver</className> </factIdentifier> <className>number</className> <factAlias>Driver</factAlias> <expressionAlias>Points</expressionAlias> <factMappingValueType>NOT_EXPRESSION</factMappingValueType> <columnWidth>114.0</columnWidth> </FactMapping> <FactMapping> <expressionElements> <ExpressionElement> <step>Violation</step> </ExpressionElement> <ExpressionElement> <step>Type</step> </ExpressionElement> </expressionElements> <expressionIdentifier> <name>0|6</name> <type>GIVEN</type> </expressionIdentifier> <factIdentifier> <name>Violation</name> <className>Violation</className> </factIdentifier> <className>Type</className> <factAlias>Violation</factAlias> <expressionAlias>Type</expressionAlias> <factMappingValueType>NOT_EXPRESSION</factMappingValueType> <columnWidth>114.0</columnWidth> </FactMapping> <FactMapping> <expressionElements> <ExpressionElement> <step>Violation</step> </ExpressionElement> <ExpressionElement> <step>Speed Limit</step> </ExpressionElement> </expressionElements> <expressionIdentifier> <name>0|7</name> <type>GIVEN</type> </expressionIdentifier> <factIdentifier> <name>Violation</name> <className>Violation</className> </factIdentifier> <className>number</className> <factAlias>Violation</factAlias> <expressionAlias>Speed Limit</expressionAlias> <factMappingValueType>NOT_EXPRESSION</factMappingValueType> <columnWidth>114.0</columnWidth> </FactMapping> <FactMapping> <expressionElements> <ExpressionElement> <step>Violation</step> </ExpressionElement> <ExpressionElement> <step>Actual Speed</step> </ExpressionElement> </expressionElements> <expressionIdentifier> <name>0|8</name> <type>GIVEN</type> </expressionIdentifier> <factIdentifier> <name>Violation</name> <className>Violation</className> </factIdentifier> <className>number</className> <factAlias>Violation</factAlias> <expressionAlias>Actual Speed</expressionAlias> <factMappingValueType>NOT_EXPRESSION</factMappingValueType> <columnWidth>114.0</columnWidth> </FactMapping> <FactMapping> <expressionElements> <ExpressionElement> <step>Fine</step> </ExpressionElement> <ExpressionElement> <step>Points</step> </ExpressionElement> </expressionElements> <expressionIdentifier> <name>0|11</name> <type>EXPECT</type> </expressionIdentifier> <factIdentifier> <name>Fine</name> <className>Fine</className> </factIdentifier> <className>number</className> <factAlias>Fine</factAlias> <expressionAlias>Points</expressionAlias> <factMappingValueType>NOT_EXPRESSION</factMappingValueType> <columnWidth>114.0</columnWidth> </FactMapping> <FactMapping> <expressionElements> <ExpressionElement> <step>Fine</step> </ExpressionElement> <ExpressionElement> <step>Amount</step> </ExpressionElement> </expressionElements> <expressionIdentifier> <name>0|12</name> <type>EXPECT</type> </expressionIdentifier> <factIdentifier> <name>Fine</name> <className>Fine</className> </factIdentifier> <className>number</className> <factAlias>Fine</factAlias> <expressionAlias>Amount</expressionAlias> <factMappingValueType>NOT_EXPRESSION</factMappingValueType> <columnWidth>114.0</columnWidth> </FactMapping> <FactMapping> <expressionElements> <ExpressionElement> <step>Should the driver be suspended?</step> </ExpressionElement> </expressionElements> <expressionIdentifier> <name>0|13</name> <type>EXPECT</type> </expressionIdentifier> <factIdentifier> <name>Should the driver be suspended?</name> <className>Should the driver be suspended?</className> </factIdentifier> <className>string</className> <factAlias>Should the driver be suspended?</factAlias> <expressionAlias>value</expressionAlias> <factMappingValueType>NOT_EXPRESSION</factMappingValueType> <columnWidth>114.0</columnWidth> </FactMapping> </factMappings> </scesimModelDescriptor> <scesimData> <Scenario> <factMappingValues> <FactMappingValue> <factIdentifier> <name>Scenario description</name> <className>java.lang.String</className> </factIdentifier> <expressionIdentifier> <name>Description</name> <type>OTHER</type> </expressionIdentifier> <rawValue class="string">Above speed limit: 10km/h and 30 km/h</rawValue> </FactMappingValue> <FactMappingValue> <factIdentifier> <name>Driver</name> <className>Driver</className> </factIdentifier> <expressionIdentifier> <name>0|1</name> <type>GIVEN</type> </expressionIdentifier> <rawValue class="string">10</rawValue> </FactMappingValue> <FactMappingValue> <factIdentifier> <name>Violation</name> <className>Violation</className> </factIdentifier> <expressionIdentifier> <name>0|6</name> <type>GIVEN</type> </expressionIdentifier> <rawValue class="string">"speed"</rawValue> </FactMappingValue> <FactMappingValue> <factIdentifier> <name>Violation</name> <className>Violation</className> </factIdentifier> <expressionIdentifier> <name>0|7</name> <type>GIVEN</type> </expressionIdentifier> <rawValue class="string">100</rawValue> </FactMappingValue> <FactMappingValue> <factIdentifier> <name>Violation</name> <className>Violation</className> </factIdentifier> <expressionIdentifier> <name>0|8</name> <type>GIVEN</type> </expressionIdentifier> <rawValue class="string">120</rawValue> </FactMappingValue> <FactMappingValue> <factIdentifier> <name>Fine</name> <className>Fine</className> </factIdentifier> <expressionIdentifier> <name>0|11</name> <type>EXPECT</type> </expressionIdentifier> <rawValue class="string">3</rawValue> </FactMappingValue> <FactMappingValue> <factIdentifier> <name>Fine</name> <className>Fine</className> </factIdentifier> <expressionIdentifier> <name>0|12</name> <type>EXPECT</type> </expressionIdentifier> <rawValue class="string">500</rawValue> </FactMappingValue> <FactMappingValue> <factIdentifier> <name>Should the driver be suspended?</name> <className>Should the driver be suspended?</className> </factIdentifier> <expressionIdentifier> <name>0|13</name> <type>EXPECT</type> </expressionIdentifier> <rawValue class="string">"No"</rawValue> </FactMappingValue> <FactMappingValue> <factIdentifier> <name>#</name> <className>java.lang.Integer</className> </factIdentifier> <expressionIdentifier> <name>Index</name> <type>OTHER</type> </expressionIdentifier> <rawValue class="string">1</rawValue> </FactMappingValue> </factMappingValues> </Scenario> </scesimData> </simulation> <background> <scesimModelDescriptor> <factMappings> <FactMapping> <expressionElements/> <expressionIdentifier> <name>1|1</name> <type>GIVEN</type> </expressionIdentifier> <factIdentifier> <name>Empty</name> <className>java.lang.Void</className> </factIdentifier> <className>java.lang.Void</className> <factAlias>Instance 1</factAlias> <expressionAlias>PROPERTY 1</expressionAlias> <factMappingValueType>NOT_EXPRESSION</factMappingValueType> <columnWidth>114.0</columnWidth> </FactMapping> </factMappings> </scesimModelDescriptor> <scesimData> <BackgroundData> <factMappingValues> <FactMappingValue> <factIdentifier> <name>Empty</name> <className>java.lang.Void</className> </factIdentifier> <expressionIdentifier> <name>1|1</name> <type>GIVEN</type> </expressionIdentifier> </FactMappingValue> </factMappingValues> </BackgroundData> </scesimData> </background> <settings> <dmnFilePath>src/main/resources/org/kie/example/traffic/traffic_violation/Traffic Violation.dmn</dmnFilePath> <type>DMN</type> <fileName></fileName> <dmnNamespace>https://kiegroup.org/dmn/_A4BCA8B8-CF08-433F-93B2-A2598F19ECFF</dmnNamespace> <dmnName>Traffic Violation</dmnName> <skipFromBuild>false</skipFromBuild> <stateless>false</stateless> </settings> <imports> <imports/> </imports> </ScenarioSimulationModel>
XML 响应示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <response type="SUCCESS" msg="Test Scenario successfully executed"> <scenario-simulation-result> <run-count>5</run-count> <ignore-count>0</ignore-count> <run-time>31</run-time> </scenario-simulation-result> </response>