Grails urlmappings,可以为urlmappings添加前缀吗?

Grails urlmappings,可以为urlmappings添加前缀吗?,grails,url-mapping,Grails,Url Mapping,例如,假设我在一个webapp上有一个API,我希望在API中使用与webapp其余部分相同的控制器和操作 在我的urlmappings文件中 "/api/$version/$apiKey/$controller/$acion/$id?" 我还有这样一个映射: "/blog/$year/$month/$day/$action" { controller = 'blog' } 现在的问题是,我能否以某种方式将api urlmapping作为博客urlmapping的前缀,以便从$yea

例如,假设我在一个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专家或groovy运行时urlmappings升级向导的帮助:)


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

我遇到了一些相同的问题,使用命名url映射解决了它:

希望这有帮助

在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>
name blogWithYear:“/api/$version/$apiKey/$controller/$year/$month/$day”:{
控制器='blog'
action='youraction'
}
展示博客

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

我认为您需要使用嵌入变量。检查url映射参考:url映射

只需添加以下映射:

static mappings = {
   "/api/$version/$apiKey/$controller/$year/$month/$day/$action"()
} 
现在您可以使用此url,例如:

http://localhost:8080/api/0.1/bs23mk4m2n4k/blog/2001/01/05/list
"/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}"))
    }
}
现在,您将被重定向到博客控制器中的列表操作。 在那里,您可以使用params显示url中的参数(如映射中定义的)


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

http://localhost:8080/api/0.1/bs23mk4m2n4k/blog/2001/01/05/list
"/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进行处理。

您能举个例子说明这对我的问题有什么好处吗?这不是我想要的。我希望避免对urlmappings进行两次硬编码(一次用于web,一次用于api)。“我希望有一个解决方案可以重用现有的非api URMAPings,而不必使用api路径作为前缀重新声明它们。”确定。你的问题遗漏了这个。但是为什么声明这个映射也是一个问题呢?使用现有映射的好处是什么?但是您有两种不同的url模式,因此需要两种映射。它们并不“完全相同”。您当时声明了多少个url映射。当你发布更多的url映射时,我可能会遇到问题。他的回答正是我想要的。在他的解决方案中,同时执行/api urlmapping和“正常”映射,w/o必须声明更多的/api urlmappings。。他的解决方案唯一不好的地方是他使用了forward()调用,这是我过去的不同之处。我最初希望urlmappings是智能的,并且理解所有非api urlmappings都应该以/api urlmapping作为前缀,从而有效地创建您在解决方案中描述的内容。但是,这不必手动完成。这将导致对所有api调用执行302重定向:(这不是一件好事……但它会起作用……更新了我的答案以进行内部转发,而不是302重定向。看起来不错,我会测试它。不过,如果我能将额外的类ApiController以及转发语句排除在图片之外,那将是最好的。但这是一个明确的解决方案!谢谢!你不会碰巧知道为什么在执行内部转发时,筛选器会运行两次。这是预期的行为吗?