2013-05-03 63 views
5

我已经构建了我的第一个Grails应用程序。我的URL映射是什么的默认应用程序提供:用grails创建/管理RESTful API的有效方法是什么?

static mappings = { 
    "/$controller/$action?/$id?"{ 
     constraints { 
      // apply constraints here 
     } 
    } 

    "/"(view:"/index") 
    "500"(view:'/error') 
} 

塞纳里奥

我有一个名为ColorController用行动savelist控制器。它只是做这样的事情:

def save() { 
    def colorInstance = new Color(params) 
    colorInstance.save(flush: true) 
} 

def list() { 
    [colorList: Color.list, colorTotal: Color.count()] 
} 

我想为这些行动建立一个简单的API。

  • 保存操作应接受JSON参数,并在记录保存时提供成功的消息。
  • 名单行动应提供列表作为JSON

问题

  • 我应该为API一个单独的URL映射? (例如http://<domain>/<app>/rest/controller/action
  • 我应该做一个单独的控制器,用于验证我的API的
  • 我使用弹簧安全插件。但是在某些时候,我可能也想要认证restful api。有什么解决方案?
  • 如果我使用相同的控制器,我如何修改这些简单的操作来完成我所需要的操作。

回答

4

在甚至在下面查看我的意见/答案之前,我建议访问此SO Question以了解Grails中对RESTful WS的基本理解。

意见:

  • “保存操作应该接受参数,JSON,并提供一个成功的消息,如果记录保存” - 保存映射到POST REST风格。而不是将JSON正文绑定到params,而是绑定到request。为了访问JSON对象,您只需在操作方法中使用request.JSON

    request.JSON instanceof JSONObject

  • “名单行动应提供的列表作为JSON” - list()动作映射到一个GET请求,您可以呈现地图的JSON在list()如下

//控制列表()

import grails.converter.JSON 
def list() { 
    [colorList: Color.list, colorTotal: Color.count()] as JSON 
} 

问题的答案: -

  1. 我应该为api制作一个单独的URL映射吗? 遵守REST的基本知识,客户端应该只能访问资源(在这种情况下为Color),不应该为基础的controlleraction打扰。服务器端逻辑应该从客户端抽象出来。 URL映射是客户将用来作为请求的形式。我想在Color资源的url映射中使用类似这样的内容。

/color/$id?(resource: "color")

/color/$id?(controller: 'color'){ 
    action = [GET: "list", POST: "save"] 
} 
  • 我应该让我的API的一个单独的控制器? - 取决于应用程序的设计方式。您也可以将上述控制器作为API。例如,目前我正在使用Grails应用程序,该应用程序在连接到Grails APP RESTFully的前端使用AngularJS。为了实现我有一个RestClientController作为一个API的Angular。在同一个应用中使用REST api的原理是,将来我们可以将底层服务暴露给除应用本身中存在的Angular客户端以外的其他客户端。

  • 我使用spring security插件进行身份验证。但是在某些时候,我可能也想要认证restful api。有什么解决方案? - 你也可以在这里使用Spring Security。在我的情况下,我使用插件,并通过使用插件的注释组件@Secured来保护controller。我还为定制的OAuth启用了与公司范围的LDAP和AD群组交互的授权。

  • 如果我使用相同的控制器,如何修改这些简单的操作来完成我所需要的操作。 - 我想你现在已经得到了这个问题的答案(在通过上面提到的SO问题之后)。这里是我的意见,controlleractions可以路由到合适的service类,基于请求参数做业务实现。

例如,

//Action 
def show(){ 
    if(params.id){ 
     colorService.getColor() 
    } else { 
     colorService.searchColor() 
    } 
} 

在上面的例子中,URL映射将是/color/123/color。在前一种情况下,它将得到color,并在稍后它将搜索颜色

+0

这有助于很多!感谢您的宝贵意见。作为一个方面说明,你有没有遇到github上的任何示例项目,暴露在grails应用程序的restful api? – Anthony 2013-05-03 16:31:33

+0

你会在github中找到这样的项目的数量。我现在为你搜索了一个。如果你愿意,你可以参考[this](https://github.com/padcom/grails-json-rest-api)。看看'JsonRestApiUrlMappings'。 – dmahapatro 2013-05-03 17:38:35

相关问题