首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Grails2.3中结合使用脚手架和RESTfulness

如何在Grails2.3中结合使用脚手架和RESTfulness
EN

Stack Overflow用户
提问于 2013-10-19 11:12:38
回答 6查看 7.9K关注 0票数 11

官方的Grails文档说

脚手架插件的2.0.x版本包含不同的脚手架模板,这些模板与Grails 2.3及更高版本中引入的新REST保持一致。(从这里取来http://grails.org/doc/latest/guide/scaffolding.html)

但是我不能让RESTfulness和脚手架一起工作(或者我不理解这个概念)。

让我们从头开始:

代码语言:javascript
复制
grails create-app myapp
cd myapp/
grails create-domain-class Book
grails create-scaffold-controller myapp.Book

向域类中添加字段

代码语言:javascript
复制
class Book {
    String text

    static constraints = {
    }
}

然后用grails run-app运行这个应用程序。在http://localhost:8080/myapp/上冲浪显示脚手架工作得很好:

  • http://localhost:8080/myapp/book/index页面显示图书列表
  • http://localhost:8080/myapp/book/show/1页面显示id =1的书籍的详细信息
  • http://localhost:8080/myapp/book/create页面创建一本书
  • 那么用力,很好的旧脚手架。

让我们看看休息怎么样。官方文档说我应该使用像http://localhost:8080/myapp/books/...这样的URL作为其余的工具,但是任何访问应用程序的尝试,比如这个curl -i -H "Accept: application/json" localhost:8080/myapp/books/1都会用一大堆HTML返回404。

好的,让我们仔细阅读文档:

在Grails中创建RESTful API的最简单方法是将域类公开为REST资源。这可以通过将grails.rest.Resource转换添加到任何域类来完成。

没问题,现在Book标题是

代码语言:javascript
复制
import grails.rest.*

@Resource(uri='/books') class Book {

现在在http://localhost:8080/myapp/上冲浪显示脚手架坏了:

  • http://localhost:8080/myapp/book/index页面显示图书列表
  • http://localhost:8080/myapp/book/create页面显示xml输出<?xml version="1.0" encoding="UTF-8"?><book><text /></book>
  • 所以强制,糟糕的新xml输出。

我曾在URLMappings.groovy中玩过@Resource和“/books”(参考资料:“book”),但没有找到任何可行的解决方案,使得脚手架和RESTfulness可以背靠背地工作。事实上,我设法使他们分开工作。

更新

我找到了实现预期目标的方法。我发现的方法是:

  1. @Resource(uri = "/books")标记图书类。
  2. 拆卸脚手架控制器BookController。
  3. 为Book:class HumanBookController {static scaffold = Book}创建带脚手架的专用控制器

现在,带有像http://localhost:8080/myapp/humanBook/index这样的URL的脚手架GUI页面工作得很好。无论是json请求还是使用http://localhost:8080/myapp/books/1之类的URL都能很好地处理。但是,让两个控制器为公共web和json做同样的事情并不优雅。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-01-06 20:33:12

你可以这样做:

代码语言:javascript
复制
import grails.rest.RestfulController

class BookController extends RestfulController {

    static responseFormats = ['html', 'json']

    BookController() {
        super(Book)
    }
}

然后在UrlMappings.groovy中:

代码语言:javascript
复制
 "/books"(resources:"book")
 "/$controller/$action?/$id?(.${format})?"{
    constraints {
        // apply constraints here
    }
  }

不需要在域中添加@Resource。现在可以让/book/1.json或/book/1.html指向正确的位置。您可能仍然需要执行grails generate-view Book来生成视图。但是,尽管您需要为html生成视图,但是您只保留单个控制器和路径。

票数 15
EN

Stack Overflow用户

发布于 2014-03-03 19:34:42

我和你有同样的问题。这可能是一个微不足道的解决方案,并不适用于每一种情况,但请尝试更新Grails版本。至于我:grails2.3.4 -> Grails2.3.6工作过。希望这对任何人都有帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-06-01 01:57:09

我目前正在使用Grails 2.4.0,解决方案是通过这样做的:

  • 控制器: BookController {静态支架= true }
  • 域:图书{.} //无资源

结果是你可以:

  • /book.json以获得列表JSONized
  • /book/index获取HTML标准脚手架
  • /book/创建新项目的html支架
  • /book/show/1 html支架编辑项目1
  • /book/show/1.jsonJSON用于项目id: 1

我不邪恶,我知道。我找到了,它让我开始工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19465421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档