规则引擎的REST URI(无状态引擎)

时间:2015-02-18 08:09:30

标签: api rest uri stateless

我需要一些指导来为规则引擎设计REST URI。有一组规则以XML文件的形式定义并存储在后端系统中。这些规则被分组为各种类别,并且基于用户指定的类别执行一组规则。用户将一组用户选择/选项和类别作为输入传递给规则引擎。规则引擎针对用户选择/选项执行属于该类别的规则。这些是类似于过程/计算的操作,它们不涉及将用户状态持久化到系统中。总的来说,用户状态不会保留在规则引擎中,即无状态规则引擎。

我正在尝试为规则引擎执行设计REST API(规则创建部分已经处理完毕):

  1. 操作不会创建,更新,删除任何服务端资源。
  2. 根据用户选择执行规则。
  3. 用户选择可能很复杂(层次结构),并且无法建模为URI参数。
  4. 请求您的指导是考虑上述方面设计REST URI模式。

    获取属于某个类别的规则:

    GET /rule_category/{id}
    

    在规则上下文中处理用户选择(规则引擎执行规则):

    POST /rule_engine
    BODY to contain a JSON structure with rule category & user selections
    

    请提供您对上述URI设计的建议以及上述用例的任何其他可能的URI。 PUT / POST应该用于规则执行URI吗?

    编辑1 :添加封装规则类别和用户选择信息的示例JSON / XML结构:

    {
        processdata:{
            rulecategory:'ruleCat1',
            userselections:{
                userselection:[
                    {
                        item:'us1'
                    },
                    {
                        item:'us2'
                    },
                    {
                        item:'us3',
                        customselection:{
                            value:'cs1'
                        }
                    }
                ]
            }
        }
    }
    
    <ProcessData RuleCategory="ruleCat1">
    <UserSelections>
        <UserSelection Item="us1"/>
        <UserSelection Item="us2"/>
        <UserSelection Item="us3">
            <CustomSelection Value="cs1"/>
        </UserSelection>
    </UserSelections>
    

2 个答案:

答案 0 :(得分:2)

REST不是远程过程调用(RPC)。 REST是关于资源的。

如果您想拥有一个处理计算的RESTful API,请将计算模型化为资源。

创建新的计算资源

请求

POST /computations
Content-Type: application/json

{
  // the selected rules etc.
}

<强>响应

201 Created
Location: /computations/748A9FC0-B74E-11E4-8822-4D7FDD9DA696

其中748A9FC0-B74E-11E4-8822-4D7FDD9DA696是服务器生成的此计算的ID。

获取计算状态

请求

GET /computations/748A9FC0-B74E-11E4-8822-4D7FDD9DA696

回复:仍在计算

200 OK
Content-Type: application/json

{
  "id": "748A9FC0-B74E-11E4-8822-4D7FDD9DA696",
  "data": { ... },
  "state": "computing"
}

回复:已完成

200 OK
Content-Type: application/json

{
  "id": "748A9FC0-B74E-11E4-8822-4D7FDD9DA696",
  "data": { ... },
  "state": "finished",
  "result": {
    // details about the result
  }
}

答案 1 :(得分:1)

在这种情况下,您唯一的选择是POST。

请注意REST有约束,例如统一接口约束,包括HATEOAS。因此,您必须向您的客户发送链接,他们可以关注这些链接。在这种情况下,您将很难解释(机器)客户端如何组装您的请求正文。克服这个问题的一种可能方法是定义特定于应用程序的请求媒体类型。

因此可以通过REST解决这个问题,但我认为你在这种情况下的工作量远远超过RPC。我同意Lutz的观点,如果您没有其他资源保留在服务器上,则不应使用规则引擎使用REST。