5

例如,假设我在 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 urmappings 的解决方案,而不必以 api 路径作为前缀重新声明它们。

4

3 回答 3

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

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

于 2011-05-12T18:34:56.007 回答
0

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

只需添加以下映射:

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
于 2011-05-12T15:18:52.353 回答
-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 您现在可以根据需要编译 url,添加参数。

于 2011-05-12T12:30:35.363 回答