5

我已经构建了我的第一个 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 安全插件进行身份验证。但在某些时候,我可能也想对 restful api 进行身份验证。有哪些解决方案?
  • 如果我使用相同的控制器,我该如何修改这些简单的动作来做我需要的事情。
4

1 回答 1

4

在下面寻找我的意见/答案之前,我建议您访问这个SO Question以基本了解 Grails 中的 RESTful WS。

意见:

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

    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 应用程序,该应用程序用于AngularJS连接到 Grails APP RESTFully 的前端。为了实现这一点,我有一个RestClientController用作 Angular 的 API。在同一个应用程序中拥有 REST api 的基本原理是,将来我们可以将底层服务公开给外部客户端,而不是Angular应用程序本身中存在的客户端。

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

  • 如果我使用相同的控制器,我该如何修改这些简单的动作来做我需要的事情。- 我想你现在已经得到了这个问题的答案(在经历了我上面提到的 SO 问题之后)。这是我的观点,可以路由到根据请求参数执行业务实现的controller actions适当类。service

例如,

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

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

于 2013-05-03T16:17:11.360 回答