在Moqui中设计/进行转换时,我如何处理资源扩展



我不知道应该如何处理转换的名称,以便在资源扩展的情况下与RESTful API的最佳实践保持一致。

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

我能够对单个资源(即客户或订单)进行平稳的转换(如Moqui中的示例应用程序文件所示),但找不到任何可以解决资源扩展目的的示例。

我所面临的问题是根据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框架中(尚未发布,只是在GitHub repo中可用,但将是下一版本的一部分),现在有一个自动实体REST接口来执行查找和CrUD操作。

它支持本问题和其他许多问题中描述的模式,例如,请参阅rest.xml屏幕文件(处理实体rest请求)中的注释:

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

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元素的使用,并且此转换仅适用于使用HTTPGET方法的请求。URL中转换位置之后的所有内容都被视为路径参数,并按路径参数元素的顺序放入上下文字段中,如上面的"exampleId"。

在您的情况下,您将有两个路径参数,一个客户ID和一个"订单"字符串,告诉它为客户检索订单。

最新更新