在Grails应用程序中实现REST API

Seb*_*mba 27 api rest grails web-services grails-2.0

我想知道什么是让Grails应用程序提供可以由Web服务使用的RESTful API(主要是一些CRUD操作)的最佳方法,例如当您想要为基于浏览器的应用程序构建相应的iOS应用程序时还要别的吗.

我想在我的Grails应用程序中构建一个单独的部分,它接受调用,www.mywebapp.com/api/someAction以便我可以重用Service层.那我怎么做URL映射呢?只有一个大ApiController不听起来非常时髦.

或者有没有更好的方法我不知道?此方法必须支持OAuth之类的功能,以对正在调用Web服务的用户进行身份验证.

cde*_*zaq 58

Grails 绝对可以提供REST api,但这样做的难度取决于你想要API的成熟程度(也就是RESTful).

基本的REST

获得RESTfullness的基本级别,使用HTTP动词的完整范围并利用HTTP响应代码来操作资源的json或xml表示非常简单.有三个主要部分来实现这一点:

  1. URL映射

    以下是我在最近的项目中编写URL映射以允许更多RESTful URL的示例:

    // RESTful list mapping
    name restEntityList: "/$controller"(parseRequest: true) {
        action = [GET: "list", POST: "save"]
    }
    
    // RESTful entity mapping
    name restEntity: "/$controller/$id"(parseRequest: true) {
        action = [GET: "show", PUT: "update", POST: "update", DELETE: "delete"]
        constraints {
            id matches: /\d+/
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 内容协商

    Grails可以通过3种不同的方式处理内容协商,使框架非常灵活,允许您支持更广泛的客户端,这些客户端可能无法设置Accept HTTP标头.

    您可以使用内容协商,withFormat根据客户端所指示的内容,使用块以不同方式响应不同的请求.这种强大的功能也可用于对API进行版本控制,就像Github一样.

  3. 响应状态

    HTTP已经内置了一个很好的响应机制,允许您利用架构中的先天能力,如可缓存性和无限制操作.虽然某些Web浏览器不能非常优雅地处理某些响应代码,但使用API​​的客户端应用程序可以使用它们来大大简化其内部代码.

干休息

使应用程序RESTful并同时保持DRY的最佳方法之一是尽可能利用控制器支架,因为CRUD对于所有域对象基本相同.这篇关于使默认控制器更加RESTful的文章,这篇关于简化默认控制器的文章都是从脚手架获得更多功能的重要资源.

高级REST

一旦达到这一点,您就可以为grails应用程序提供功能强大的REST API.您可以执行所有基本的CRUD操作,并且资源相当容易使用.

梯子的一个真正的RESTful API的超媒体接下来的水平,但是,有很多难以实现.修复此问题是在Grails的路线图上,但目前这是相当痛苦的.这些作品是:

  1. 超媒体资源
  2. 内容类型
  3. 版本

值得庆幸的是,有一个插件可以很容易地定义定制marshallers,这使我们可以相当容易地覆盖REST难题的其余三个部分.

最后,还有保护整个事物的方面.一般而言,Spring Security将帮助您保护用户访问您的api.由于大多数API访问来自应用程序,并且不是用户可见的,因此基本或摘要式身份验证通常是最简单的方法.这里一个OAuth的插件是建立在Spring安全.我没有亲自使用它,所以我不能保证它的稳定性,但它看起来对我很好.

一般来说,Grails非常灵活且功能强大,可以非常非常好地完成REST,但是还没有完成它的工作,以使它干净利落地完成REST.

  • 我很乐意帮忙.Grails是一个很棒的框架,在我看来,REST只是对网络上的事物有意义的唯一体系结构.如果您有更具体的问题或正在寻求帮助并回馈社区,请随意访问Freenode上的#grails IRC频道. (4认同)

nat*_*don 6

关于设置RESTfull api,grails文档有一个很好的步骤

http://grails.org/doc/latest/guide/webServices.html#13.1