设计问题:如何创建由多个域对象构成的restful接口?

时间:2011-04-08 19:00:59

标签: rest grails gorm

所以,我们从我们公司的grails开始,我们正在创建这个应用程序,它使用ExtJS作为前端,Grails在后端。

因为ExtJS只使用JSON来填充数据表等,所以我们面临着创建这些接口的挑战,这些接口将以一种宁静的方式向ExtJS发送和接收JSON对象。

在审议了我们的域名模型后,我们选择了一个。很快,我们意识到系统中的某些表将由来自多个域对象的信息组成。

经过一番搜索,我们找到了JSON RESTful API for GORM插件,它基本上为任何给定的域对象公开了一个RESTful接口。

这使我们了解问题的主要观点。

我看到它的方式,有两种方法可以继续。

1)创建一个特定于ExtJS中每个数据表的控制器,它将具有不同的操作,并且在每个操作中,它将创建或接收JSon对象,以对数据表使用的不同域对象执行CRUD。

在我看来,这会更耗时。无论如何,这是一个选择。

2)另一个选项是通过创建一个特定于我们想要填充的数据表的“复合”域对象来实现前面提到的插件(该对象中的每个属性都是数据表中的一列)。在此之后,只需使用JSON RESTful API for GORM插件公开它,它基本上为我们处理整个CRUD操作。

有没有办法在我们的域模型中创建一个像我们想要的那样的对象而不在后端实际创建更多的数据库表?

我相信我们走的是正确的道路,我们只需要专家的一些指导:)

提前感谢!

2 个答案:

答案 0 :(得分:1)

有趣。

我最后采用了不同的方法,让我知道你的想法。

基本上,我们最终使用此插件:http://grails.org/plugin/json-rest-api来公开域类并完成所有CRUD操作。

我们所做的是为每个类创建一个自定义JSON编组器,就像这样。

Bootstrap.groovy

[...] 
        JSON.registerObjectMarshaller(Person){ 
                def returnArray = [:] 

                returnArray['id'] = it.id 
                returnArray['name'] = it.name 
                returnArray['street'] = it.address.street 

                return returnArray 
        }

Person.groovy

      //the plugin exposes the class with this 
       static expose = ['person'] 

       String name 
       Address address 
[...] 

当调用“as JSON”方法时,marshaller实际上会对如何转换类进行操作。

所以现在,由于插件,我们可以做到

GET http://mydomain.com/api/person我们得到一个json对象,其中包含来自person和其他类的信息,如下所示:

{"data":{"id":"1", "name":"Peter", "Spooner St"}} 

唯一的问题是,如果可能的话,我们现在必须弄清楚如何从更新或创建中更新街道地址。

思考?

答案 1 :(得分:0)

在您的情况下,我建议创建一组处理它们的Command对象和控制器。这将优雅地允许您的“复合”方法。

Command object是一个具有Domain对象具有的所有酷的验证和数据绑定功能但没有直接持久性的类。

结帐的链接:

Command Objects

JSON Responses