假设我们有一个grails web应用程序,它暴露了几个资源。
该应用程序具有经典的Web界面,用户可以与之交互并进行一些管理。 我们希望通过RESTful API将应用程序中的资源公开给客户端,并且我们不希望应用程序的这一部分混乱我们已有的控制器和代码。 所以我们想出了以下内容:
如果网络界面提供host/app_path/url/[list|show|create]
,我们希望REST API位于/host/app_path/rest/url
。
所以我们最终得到了以下UrlMappings文件:
class UrlMappings {
static mappings = {
"/$controller/$action?/$id?"{
}
/* adding new urls and listing them */
"/rest/url"{
controller = "urlRest"
action = [POST: "save", PUT: "save", GET: "list", DELETE:"error"]
}
/* accessing a single url */
"/rest/url/$id"{
controller = "urlRest"
action = [POST: "update", PUT: "update", GET: "show", DELETE: "delete"]
}
/* non-crud stuff on urls */
"/rest/url/$action?/$id?"{
controller = "urlRest"
}
"/"(view:"/index")
"500"(view:'/error')
}
}
问题是,这不是这里最干的事情。随着我们添加更多资源(如标签),情况会变得更糟。他们会翻译成另外三个非常相似的代码块......
非crud函数将是搜索特定标准等等...
我们尝试使用循环生成映射闭包,但没有成功。我们完全走错了吗?
答案 0 :(得分:7)
我建议使用以下映射:
"/rest/url/$id?"(resource:"urlRest")
下面是为urlRestController创建的HTTP方法到动作映射:
GET show
PUT update
POST save
DELETE delete
我明白为什么你可能想要映射/ rest / url POST来保存和/ rest / url / id PUT来更新,但这违背了这些动词的含义。 PUT应该是添加新网址和POST的唯一方法来更新网址。如果您的约束是保持当前控制器代码不变,那么按照您的布局方式进行操作可能是最好的方法。但是,我的猜测是你的控制器可能已被编码以处理默认映射就好了(如果没有id则更新/删除给出错误,如果没有id则显示重定向到列表等)。