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

使用grails创建/管理RESTful API的有效方法是什么?,api,rest,grails,restful-authentication,Api,Rest,Grails,Restful Authentication,我已经构建了我的第一个grails应用程序。我的URL映射是默认应用程序提供的: static mappings = { "/$controller/$action?/$id?"{ constraints { // apply constraints here } } "/"(view:"/index") "500"(view:'/error') } Senario 我有一个名为ColorControll

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

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

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

我有一个名为
ColorController
的控制器,具有操作
save
list
。它只是做了这样的事情:

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:////rest/controller/action
  • 我应该为我的API制作一个单独的控制器吗
  • 我正在使用spring安全插件进行身份验证。但在某个时候,我可能也想对restful api进行身份验证。有什么解决办法
  • 如果我使用相同的控制器,我如何修改这些简单的操作来完成我所需要的
在下面查找我的观点/答案之前,我建议访问本文,以基本了解Grails中的RESTful WS

意见:

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

    JSONObject的request.JSON实例

  • “列表操作应以JSON的形式提供列表”-
    list()
    操作映射到GET请求,您可以在
    list()
    中以JSON的形式呈现映射,如下所示
//控制器列表()

问题答案:-

  • 我应该为api创建单独的URL映射吗? 遵循REST的基本原则,客户机应该只访问资源(本例中为
    Color
    ),而不应该关心底层的
    控制器
    操作
    。服务器端逻辑应该从客户端抽象出来。URL映射是客户端用来作为请求形式的映射。在
    Color
    资源的url映射中,我会有类似的内容
  • /color/$id?(资源:“color”)

    • 我应该为我的API制作一个单独的控制器吗?-取决于应用程序的设计方式。您还可以将上述控制器作为API。例如,目前我正在开发一个grails应用程序,它在前端使用了
      AngularJS
      ,并以RESTful方式连接到grails应用程序。为了实现这一点,我使用了一个
      RestClientController
      ,它可以作为Angular的API。在同一个应用程序中使用RESTAPI的基本原理是,将来我们可以将底层服务公开给外部客户端,而不是应用程序本身中的
      Angular
      客户端

    • 我正在使用spring安全插件进行身份验证。但在某个时候,我可能也想对restful api进行身份验证。有什么解决办法您也可以在这里使用Spring Security。在我的例子中,我正在使用插件,并通过使用插件的注释组件
      @Secured
      来保护
      控制器。我已经启用了自定义的
      OAuth
      ,以及与公司范围的LDAP和AD组交互的授权

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

    比如说,

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

    在上面的示例中,url映射将是
    /color/123
    /color
    。在前一种情况下,它将获得
    颜色
    ,在后一种情况下,它将搜索非常有用的颜色

    !!谢谢你的宝贵意见。顺便说一句,您在github上遇到过任何在grails应用程序中公开restful api的示例项目吗?您将在github中找到此类项目的数量。我现在在找你。如果你愿意,你可以参考。查看
    JsonRestApiUrlMappings
    /color/$id?(controller: 'color'){
        action = [GET: "list", POST: "save"]
    }
    
    //Action
    def show(){
       if(params.id){
          colorService.getColor()
       } else {
          colorService.searchColor()
       }
    }