Grails urlmappings,可以一个前缀urlmappings吗?

net*_*ain 5 grails url-mapping

例如,假设我在 webapp 上有一个 API,并且我希望在 API 中使用与 webapp 的其余部分相同的控制器和操作。

在我的 urlmappings 文件中,我有

"/api/$version/$apiKey/$controller/$acion/$id?"
Run Code Online (Sandbox Code Playgroud)

我也有这样的映射:

"/blog/$year/$month/$day/$action" {
   controller = 'blog'
 }
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我能否以某种方式将 api urlmapping 加到博客 urlmapping 的前缀,以便我可以从 $year、$month、$day 变量中受益?以这样一种方式,对以下 url 的 GET 请求将是有效的:

GET /api/0.1/bs23mk4m2n4k/blog/2001/01/05/list
Run Code Online (Sandbox Code Playgroud)

还是我被迫执行以下请求?

GET /api/0.1/bs23mk4m2n4k/blog/list?year=2004&month=01&day=05
Run Code Online (Sandbox Code Playgroud)

需要 urlmappings GURU 或 groovy 运行时 urlmappings 操作向导的帮助:)

我想要一个可以重用现有非 api urmapping 的解决方案,而不必使用 api 路径作为前缀重新声明它们。

ata*_*lor 3

您可以让 ApiController 去掉 api 参数,然后重定向到博客控制器。例如:

"/api/$version/$apiKey/$rest**" {
     controller:'api'
     action:'default'
}


import org.codehaus.groovy.grails.web.util.WebUtils
class ApiController {
    def grailsUrlMappingsHolder

    def default = {
        // validate apiKey, etc
        WebUtils.forwardRequestForUrlMappingInfo(request, response, grailsUrlMappingsHolder.match("/${params.rest}"))
    }
}
Run Code Online (Sandbox Code Playgroud)

API 控制器可以访问版本和 apiKey 参数,并传递其余参数以供博客控制器的 UrlMapping 处理。