在设计/制作Moqui过渡时如何处理资源扩展?

时间:2015-02-27 14:24:17

标签: moqui

我无法弄清楚如何处理转换的名称,以便在资源扩展的情况下与RESTful API的最佳实践保持一致。

例如,如果我想获取特定客户的所有订单,则URI应该像https://api.website.com/customers/1000/orders

我能够为单个资源(即客户或订单)进行转换,因为它在Moqui的示例应用程序文件中得到了证明。但是无法找到任何可以解决资源扩展目的的示例。 / p>

我面临的问题是根据restful API的最佳实践设计转换。 ExampleApp.xml仅包含单个资源的示例,即示例实体。

如果我采用HiveMind中关于项目管理的数据模型的情况,那么根据最佳实践,URI应该是这样的

For fetching all Projects- https://api.website.com/projects
For fetching a Milestone for a particular Project - https://api.website.com/projects/DP/milestones/DP-MS-01 (Here, DP is the Project Id)
For fetching a Tasks of a particular Project- https://api.website.com/projects/DP/tasks/DP-1

现在,如果我在Moqui框架中设计API,我就必须为URI命名

For fetching all Projects- https://api.website.com/projects
For fetching a Milestone of a Project- https://api.website.com/projects/DP/DP-MS-1
For fetching a Task of a Project- https://api.website.com/projects/DP/DP-1

因此,您可以看到这些URI令人困惑,因为我无法区分用于获取里程碑或任务的URI。

我仍然可以通过检查路径参数(即,如果任务在路径参数中,然后执行与任务相关的操作以及类似的里程碑),按照restful API设计的最佳实践来制作URI。但是这种方法不会很干净,因为如果URI中的参数太多,就像https://api.website.com/projects/DP/milestones/DP-MS-1/tasks/DP-1/worklogs/DP-1-WL-2/party那样,它的维护就会变得很难。

这只是一个示例场景,我希望在特定项目的特定里程碑中获得为任务添加工作日志的派对/人员。这是一个数据模型的情况,即WorkEffort。

但是派对,客户,订单,产品等数据模型呢?设计API将成为API开发人员非常繁琐的工作。

所以我只是想问一下Moqui是否有另一种清洁方法可供我参考?

2 个答案:

答案 0 :(得分:1)

在最新版本的Moqui Framework(尚未发布,仅在GitHub回购中可用,但将成为下一版本的一部分)中,现在有一个自动实体REST接口来执行查找和CrUD操作。

它支持此问题中描述的模式以及许多其他模式,对于某些示例,请参阅rest.xml屏幕文件中的注释(处理实体REST请求):

https://github.com/moqui/moqui/blob/master/runtime/base-component/webroot/screen/webroot/rest.xml

答案 1 :(得分:0)

Moqui中处理此问题的概念是路径参数。最简单的示例是ExampleApp.xml屏幕中的RESTful服务示例:

https://github.com/moqui/moqui/blob/master/runtime/base-component/example/screen/ExampleApp.xml

示例请求,在该屏幕的评论中,使用curl看起来像:

curl -X GET -H "Authorization: Basic am9obi5kb2U6bW9xdWk=" 
    http://localhost:8080/apps/example/ExampleEntity/TEST2

处理此请求的转换如下:

<transition name="ExampleEntity" method="get" read-only="true">
    <path-parameter name="exampleId"/>
    <actions>
        <entity-find-one entity-name="Example" value-field="example"/>
        <script>ec.web.sendJsonResponse(example)</script>
    </actions>
    <default-response type="none"/>
</transition>

请注意使用transition.path-parameter元素,并且此转换仅适用于使用HTTP GET方法的请求。 URL中的转换位置之后的所有内容都被视为路径参数,并按照路径参数元素的顺序放在上下文字段中,如上面的“exampleId”。

在您的情况下,您将拥有2个路径参数,一个客户ID和“orders”字符串,告诉它检索客户的订单。

相关问题