使用grails创建/管理RESTful API的有效方法是什么?

时间:2013-05-03 15:18:45

标签: api rest grails restful-authentication

我已经构建了我的第一个grails应用程序。我的URL映射是默认应用程序提供的:

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
  • 制作单独的控制器吗?
  • 我正在使用spring security插件进行身份验证。但在某些时候我可能也想验证restful api。有什么解决方案?
  • 如果我使用相同的控制器,我该如何修改这些简单的操作来完成我需要的操作。

1 个答案:

答案 0 :(得分:4)

在我下面查看我的观点/答案之前,我建议您访问此SO Question以了解Grails中RESTful WS的基本知识。

<强>评论:

  • “保存操作应接受参数作为JSON,如果记录保存” - 保存映射到POST RESTful,则提供成功消息。它不是将JSON主体绑定到params,而是绑定到request。要访问JSON对象,您只需在操作方法中使用request.JSON

    request.JSON instanceof JSONObject

  • “列表操作应提供列表为JSON” - list()操作映射到GET请求,您可以将映射呈现为list()中的JSON以下

// Controller list()

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

问题解答: -

  1. 我应该为api创建单独的URL映射吗? 遵循REST的基础知识,客户端应该只访问资源(在这种情况下为Color),不应该对基础controlleraction感到烦恼。服务器端逻辑应该从客户端抽象出来。 URL映射是客户端用作请求形式的内容。我会在Color资源的网址映射中找到类似的内容。
  2. /color/$id?(resource: "color")

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

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

    • 如果我使用相同的控制器,我怎样才能修改这些简单的操作来完成我需要的操作。 - 我想你现在可以得到这个问题的答案了(去了之后)通过我上面提到的SO问题)。我的意见是,controller actions可以路由到适当的service类,这些类根据请求参数执行业务实现。

    例如,

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

    在上面的示例中,网址映射为/color/123/color。在前一种情况下,它将获得color,之后它将搜索颜色