官方 Grails 文档说
2.0.x 版的脚手架插件包括不同的脚手架模板,这些模板与 Grails 2.3 及更高版本中引入的新 REST API 保持一致。(取自这里http://grails.org/doc/latest/guide/scaffolding.html)
但是我不能(或者我不理解这个概念)将 RESTful 与脚手架一起工作。
让我们从头开始:
grails create-app myapp
cd myapp/
grails create-domain-class Book
grails create-scaffold-controller myapp.Book
向域类添加字段
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
页面创建一本书- 等力,好旧的脚手架。
让我们看看 REST 怎么样。官方文档说我应该使用http://localhost:8080/myapp/books/...
REST 之类的 URL,但是任何访问应用程序的尝试,就像这样curl -i -H "Accept: application/json" localhost:8080/myapp/books/1
返回 404 和一堆 HTML。
好的,让我们仔细阅读文档:
在 Grails 中创建 RESTful API 的最简单方法是将域类公开为 REST 资源。这可以通过将 grails.rest.Resource 转换添加到任何域类来完成
没问题,现在 Book 类的标题是
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"(resources:"book"),但没有找到任何可行的解决方案,可以使脚手架和 RESTful 背靠背工作。事实上,我设法让它们分开工作。
更新
我找到了实现预期目标的方法。我找到的方法是:
- 用标记Book类
@Resource(uri = "/books")
。 - 移除脚手架控制器BookController。
- 为 Book 创建带有脚手架的专用控制器:
class HumanBookController {static scaffold = Book}
现在,带有类似 URL 的脚手架 GUI 页面http://localhost:8080/myapp/humanBook/index
工作得很好。json 请求都可以通过http://localhost:8080/myapp/books/1
. 但是让 2 个控制器为常见的 web 和 json 做同样的事情并不优雅。