【发布时间】:2013-10-28 05:27:35
【问题描述】:
Grails 官方文档说
2.0.x 版本的脚手架插件包含不同的脚手架 与 Grails 中引入的新 REST API 一致的模板 2.3及以上。 (取自这里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/createpage 创建一本书 - 等等,好旧的脚手架。
让我们看看 REST 怎么样。
官方文档说我应该为 REST 使用像 http://localhost:8080/myapp/books/... 这样的 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") 但没有找到任何可行的解决方案可能的脚手架和 RESTfulness 背靠背工作。事实上,我设法让它们分开工作。
更新
我找到了实现预期目标的方法。我找到的方法是:
- 用
@Resource(uri = "/books")标记Book类。 - 删除脚手架控制器BookController。
- 为书创建带有脚手架的专用控制器:
class HumanBookController {static scaffold = Book}
现在,带有http://localhost:8080/myapp/humanBook/index 之类的 URL 的基架 GUI 页面可以很好地工作。使用http://localhost:8080/myapp/books/1 之类的 URL 可以很好地处理 json 请求。但是让 2 个控制器为普通的 web 和 json 做同样的事情并不优雅。
【问题讨论】:
-
尝试将
"/books"(resources:"book")添加到您的域中的 urlmapping.groovy 中,而不是 @Resource 看看是否有帮助,您可以使用url-mappings-report查看哪些服务被公开。 -
Alidad,我试过了 - 但它不起作用(返回 404 表示有效请求)。我猜,只有
@Resource在运行时生成所需的控制器。此外,文档说 UrlMapping 中的 RESTy URL 映射应与@Resource结合使用 - 它只是定义具有一些附加(如嵌套资源)功能的映射的另一个地方。 -
我目前(使用 2.4.0)有同样的问题,就像映射都是错误的。 :(
-
该解决方案不适用于 2.4.4。如果我从控制器中删除静态脚手架 = true,则 REST URL 仍然给出 404。基本上,@Resource 似乎什么都不做。
-
根据 evanwong 下面的帖子,这在 2.4.4 中对我有用,但在域类中没有 @Resource 但在 UrlMappings.groovy 中:“/books”(资源:“Book” )。我有 REST 和脚手架屏幕根据需要一起工作。还要非常感谢 Alidad 提供有关 grails url-mappings-report 命令的提示。
标签: rest grails scaffolding