7.3. 使用 KIE 服务器 REST API 执行 DMN 服务
与 KIE 服务器的 REST 端点直接交互,提供调用代码和决策逻辑定义之间的最分离。调用代码完全没有直接依赖项,您可以在一个完全不同的开发平台(如 Node.js 或 .NET )中实施。本节中的示例演示 Nix 风格的 curl 命令,但提供相关信息来适应任何 REST 客户端。
当您使用 KIE 服务器的 REST 端点时,最佳实践是定义一个域对象 POJO Java 类,使用标准 KIE 服务器 marshalling 注解标注。例如,以下代码使用正确注解的域对象 Person 类:
POJO Java 类示例
@javax.xml.bind.annotation.XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD)
public class Person implements java.io.Serializable {
static final long serialVersionUID = 1L;
private java.lang.String id;
private java.lang.String name;
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(org.kie.internal.jaxb.LocalDateXmlAdapter.class)
private java.time.LocalDate dojoining;
public Person() {
}
public java.lang.String getId() {
return this.id;
}
public void setId(java.lang.String id) {
this.id = id;
}
public java.lang.String getName() {
return this.name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public java.time.LocalDate getDojoining() {
return this.dojoining;
}
public void setDojoining(java.time.LocalDate dojoining) {
this.dojoining = dojoining;
}
public Person(java.lang.String id, java.lang.String name,
java.time.LocalDate dojoining) {
this.id = id;
this.name = name;
this.dojoining = dojoining;
}
}
有关 KIE Server REST API 的更多信息,请参阅使用 KIE API 与 Red Hat Decision Manager 交互。
先决条件
-
KIE 服务器是安装和配置的,包括具有
kie-server角色的用户的已知用户名和凭证。有关安装选项,请参阅 规划 Red Hat Decision Manager 安装。 您已将 DMN 项目构建为 KJAR 工件并将其部署到 KIE 服务器:
mvn clean install
有关项目打包和部署以及可执行模型的更多信息,请参阅 打包和部署 Red Hat Decision Manager 项目。
- 您有包含 DMN 模型的 KIE 容器的 ID。如果存在多个模型,还必须知道相关模型的型号命名空间和型号名称。
流程
确定用于访问 KIE 服务器 REST API 端点的基础 URL。这需要了解以下值(使用默认本地部署值作为示例):
-
主机(
本地主机) -
端口(
8080) -
根上下文(
kie-server) -
基本 REST 路径(
services/rest/)
本地部署中的基本 URL 示例:
http://localhost:8080/kie-server/services/rest/-
主机(
确定用户身份验证要求。
当在 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 端点同时使用 JSON 和 XML 格式,并使用请求标头来设置:
JSON
curl -H "accept: application/json" -H "content-type: application/json"
XML
curl -H "accept: application/xml" -H "content-type: application/xml"
可选:查询容器以获取部署决策模型列表:
[GET]
server/containers/{containerId}/dmncurl 请求示例:
curl -u krisv:krisv -H "accept: application/xml" -X GET "http://localhost:8080/kie-server/services/rest/server/containers/MovieDMNContainer/dmn"
XML 输出示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <response type="SUCCESS" msg="OK models successfully retrieved from container 'MovieDMNContainer'"> <dmn-model-info-list> <model> <model-namespace>http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a</model-namespace> <model-name>dmn-movieticket-ageclassification</model-name> <model-id>_99</model-id> <decisions> <dmn-decision-info> <decision-id>_3</decision-id> <decision-name>AgeClassification</decision-name> </dmn-decision-info> </decisions> </model> </dmn-model-info-list> </response>JSON 输出示例:
{ "type" : "SUCCESS", "msg" : "OK models successfully retrieved from container 'MovieDMNContainer'", "result" : { "dmn-model-info-list" : { "models" : [ { "model-namespace" : "http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a", "model-name" : "dmn-movieticket-ageclassification", "model-id" : "_99", "decisions" : [ { "decision-id" : "_3", "decision-name" : "AgeClassification" } ] } ] } } }执行模型:
[POST]
server/containers/{containerId}/dmncurl 请求示例:
curl -u krisv:krisv -H "accept: application/json" -H "content-type: application/json" -X POST "http://localhost:8080/kie-server/services/rest/server/containers/MovieDMNContainer/dmn" -d "{ \"model-namespace\" : \"http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a\", \"model-name\" : \"dmn-movieticket-ageclassification\", \"decision-name\" : [ ], \"decision-id\" : [ ], \"dmn-context\" : {\"Age\" : 66}}"JSON 请求示例:
{ "model-namespace" : "http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a", "model-name" : "dmn-movieticket-ageclassification", "decision-name" : [ ], "decision-id" : [ ], "dmn-context" : {"Age" : 66} }XML 请求示例(JAXB 格式):
<?xml version="1.0" encoding="UTF-8"?> <dmn-evaluation-context> <model-namespace>http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a</model-namespace> <model-name>dmn-movieticket-ageclassification</model-name> <dmn-context xsi:type="jaxbListWrapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <type>MAP</type> <element xsi:type="jaxbStringObjectPair" key="Age"> <value xsi:type="xs:int" xmlns:xs="http://www.w3.org/2001/XMLSchema">66</value> </element> </dmn-context> </dmn-evaluation-context>注意无论请求格式如何,请求都需要以下元素:
- 型号命名空间
- 型号名称
- 包含输入值的上下文对象
JSON 响应示例:
{ "type" : "SUCCESS", "msg" : "OK from container 'MovieDMNContainer'", "result" : { "dmn-evaluation-result" : { "messages" : [ ], "model-namespace" : "http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a", "model-name" : "dmn-movieticket-ageclassification", "decision-name" : [ ], "dmn-context" : { "Age" : 66, "AgeClassification" : "Senior" }, "decision-results" : { "_3" : { "messages" : [ ], "decision-id" : "_3", "decision-name" : "AgeClassification", "result" : "Senior", "status" : "SUCCEEDED" } } } } }XML(JAXB 格式)响应示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <response type="SUCCESS" msg="OK from container 'MovieDMNContainer'"> <dmn-evaluation-result> <model-namespace>http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a</model-namespace> <model-name>dmn-movieticket-ageclassification</model-name> <dmn-context xsi:type="jaxbListWrapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <type>MAP</type> <element xsi:type="jaxbStringObjectPair" key="Age"> <value xsi:type="xs:int" xmlns:xs="http://www.w3.org/2001/XMLSchema">66</value> </element> <element xsi:type="jaxbStringObjectPair" key="AgeClassification"> <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema">Senior</value> </element> </dmn-context> <messages/> <decisionResults> <entry> <key>_3</key> <value> <decision-id>_3</decision-id> <decision-name>AgeClassification</decision-name> <result xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Senior</result> <messages/> <status>SUCCEEDED</status> </value> </entry> </decisionResults> </dmn-evaluation-result> </response>