例如,假设我在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路径作为前缀重新声明它们。
答案 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,您现在可以根据需要编译网址,添加参数。