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

时间:2011-05-12 12:24:07

标签: grails url-mapping

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

在我的urlmappings文件中我有

"/api/$version/$apiKey/$controller/$acion/$id?"

我也有这样的映射:

"/blog/$year/$month/$day/$action" {
   controller = 'blog'
 }

现在的问题是,我可以以某种方式将api urlmapping加到博客urlmapping上,这样我就能从$ year,$ month,$ day变量中获益吗?以这种方式,对以下URL的GET请求有效:

GET /api/0.1/bs23mk4m2n4k/blog/2001/01/05/list

或者我被迫做了以下请求?

GET /api/0.1/bs23mk4m2n4k/blog/list?year=2004&month=01&day=05

需要来自urlmappings GURU或groovy运行时urlmappings maniuplation WIZARD的帮助:)

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

3 个答案:

答案 0 :(得分:2)

您可以从api参数中删除ApiController,然后重定向到博客控制器。例如:

"/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}"))
    }
}

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

答案 1 :(得分:0)

我认为你想使用嵌入式变量。检查网址映射参考:http://grails.org/doc/latest/guide/single.html#6.4网址映射

只需添加以下映射:

static mappings = {
   "/api/$version/$apiKey/$controller/$year/$month/$day/$action"()
} 

现在您可以使用此网址作为示例:

http://localhost:8080/api/0.1/bs23mk4m2n4k/blog/2001/01/05/list

现在您被重定向到博客控制器中的列表操作。 在那里你可以使用params来显示url中的参数(如映射中所定义)。

离。

params.version

答案 2 :(得分:-1)

我有一些相同的问题,使用命名的url映射解决了它:http://www.grails.org/doc/latest/guide/6.%20The%20Web%20Layer.html#6.4.9%20Named%20URL%20Mappings

希望这有帮助!

在urlMapping中

name blogWithYear:"/api/$version/$apiKey/$controller/$year/$month/$day":{
controller = 'blog'
action = 'youraction'
}

<g:link mapping="blogWithYear" params="[$version:'0.1', ....., '$year: 2011']">
Show blog
</g:link>

使用g:link,您现在可以根据需要编译网址,添加参数。