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

Ant*_*ony 5 api rest grails restful-authentication

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

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

    "/"(view:"/index")
    "500"(view:'/error')
}
Run Code Online (Sandbox Code Playgroud)

塞纳里奥

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

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

def list () {
   [colorList: Color.list, colorTotal: Color.count()]
}
Run Code Online (Sandbox Code Playgroud)

我想为这些操作构建一个简单的API.

  • 保存操作应接受参数作为JSON,并在记录保存时提供成功的消息.
  • 列表操作应该将列表提供为JSON

问题

  • 我应该为api制作单独的URL映射吗?(例如http://<domain>/<app>/rest/controller/action)
  • 我应该为我的API制作一个单独的控制器吗?
  • 我使用spring security插件进行身份验证.但在某些时候我可能也想验证restful api.有什么解决方案?
  • 如果我使用相同的控制器,我如何修改这些简单的操作来做我需要的.

dma*_*tro 4

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

意见:

  • “保存操作应接受 JSON 格式的参数,并在记录保存时提供成功消息” - 保存映射到 POST RESTful。不是将 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
}
Run Code Online (Sandbox Code Playgroud)

问题解答:-

  1. 我应该为 api 做一个单独的 URL 映射吗? 遵守 REST 的基础知识,客户端应该只访问资源(Color在本例中),而不应该关心底层controlleraction. 服务器端逻辑应该从客户端抽象出来。URL 映射是客户端使用的请求形式。我的资源 url 映射中会有类似的内容Color

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

或者

/color/$id?(controller: 'color'){
    action = [GET: "list", POST: "save"]
}
Run Code Online (Sandbox Code Playgroud)
  • 我应该为我的 API 创建一个单独的控制器吗?- 取决于应用程序的设计方式。您还可以将上述控制器作为 API。例如,目前我正在开发一个 Grails 应用程序,该应用程序AngularJS在前端使用,连接到 Grails 应用程序 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()
   }
}
Run Code Online (Sandbox Code Playgroud)

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