【发布时间】:2019-07-03 13:44:43
【问题描述】:
我对此感到疑惑,这是我之前遇到的问题,只是使用一堆逐行映射解决了问题。
假设我想要一个带有几个屏幕(页面)的 Grails 3.3 应用程序,使用以下旧/标准映射:
static mappings = {
"/$controller/$action?/$id?(.$format)?"{
constraints {
// apply constraints here
}
}
}
但我还想要一个(非常小的)API 样式映射,例如:
static mappings = {
get "/api/$controller(.$format)?"(action:"index", namespace:'api')
get "/api/$controller/$id(.$format)?"(action:"show", namespace:'api')
post "/api/$controller"(action:"save", namespace:'api')
put "/api/$controller/$id"(action:"updateStatus", namespace:'api')
patch "/api/$controller/$id"(action:"patch", namespace:'api')
delete "/api/$controller/$id"(action:"delete", namespace:'api')
}
普通控制器没有命名空间,我希望通过 grails 默认样式访问它们。但我希望 API 可以访问(包括使用 createLink() 等的反向映射,如果可能的话,以保持简单。
我尝试了多种配置,发现以下得到了正向映射(通过 URL 找到控制器和操作),但反向映射始终默认为“/$controller/$action? /$id?(.$format)?"样式链接(我更愿意为这些生成 404,尽管我可以继续访问它)。例如。完整代码为:
class UrlMappings {
static mappings = {
get "/api/$controller(.$format)?"(action:"index", namespace:'api')
get "/api/$controller/(.$format)?"(action:"index", namespace:'api')
get "/api/$controller/$id(.$format)?"(action:"show", namespace:'api')
post "/api/$controller"(action:"save", namespace:'api')
put "/api/$controller/$id"(action:"updateStatus", namespace:'api')
patch "/api/$controller/$id"(action:"patch", namespace:'api')
delete "/api/$controller/$id"(action:"delete", namespace:'api')
"/$controller/$action?/$id?(.$format)?"{
constraints {
// apply constraints here
}
}
"/"(view:"/index")
"500"(view:'/error')
"404"(view:'/notFound')
}
}
有没有办法让这个以我想要的方式工作 - 例如有一个反向 URL - 例如createLink(...) 工作?我想我曾经在另一个应用程序上使用过命名映射,但这些似乎很快就失控了。
目前如果我这样做了
"${createLink(namespace:'api', controller:'upload', action:'post')}"
结果是 /upload/post 而我想要的是 /api/upload
最终(希望编辑)- 这似乎比以我不希望使用反向映射的格式出现的 URL 有点大。虽然前向映射仅与控制器一起“工作”,但当我打开 Grails Spring 安全性时,我在 URL 的 /api/upload 版本上被拒绝访问,我不是 100% 确定,但查看它出现的日志是因为代码找不到控制器,因此找不到 @Secured 注释。
【问题讨论】:
-
The "normal" controllers don't have any namespace while the API controllers are all namespaced to 'api'. Is there anyway to get this working and have a reverse URL - e.g. createLink(...) work?- 不清楚你所说的“工作”和什么不工作。 -
啊,我会更新更多代码。目前,我检查并发现正向映射很好,但反向映射不行。
-
你有
createLink(namespace:'api', controller:'upload', action:'post')。您要链接到的控制器中的操作是否命名为post?此外,您的问题中没有足够的信息可以确定,但您可能希望使用createLink(namespace:'api', controller:'upload', action:'post', method: 'POST')之类的内容指定 HTTP 方法
标签: grails