在Grails3中参数化URL映射

在Grails3中参数化URL映射,grails,grails-3.0,Grails,Grails 3.0,我有一个想法,我想为我的两类URL分配前缀。一类是 /baseurl/api/$controller 对于安全的REST URL,然后: /baseurl/register/$action 对于当前一类不安全的URL 然后我认为最好将前缀/api和/register存储在变量中,以便在需要时可以在其他地方引用它们(例如我的安全配置)。然而,我无法在我的UrlMappings中实现这一点。似乎没有填充定义URL部分的变量。考虑下面的URLMAPPIN .GROOVY,在这里我定义了一个Simu

我有一个想法,我想为我的两类URL分配前缀。一类是

/baseurl/api/$controller
对于安全的REST URL,然后:

/baseurl/register/$action
对于当前一类不安全的URL

然后我认为最好将前缀/api和/register存储在变量中,以便在需要时可以在其他地方引用它们(例如我的安全配置)。然而,我无法在我的UrlMappings中实现这一点。似乎没有填充定义URL部分的变量。考虑下面的URLMAPPIN .GROOVY,在这里我定义了一个SimultMutual.GooVy来映射到注册,并且每个其他的控制器都是API相关的:

class UrlMappings {
    static final API_URL_ROOT = "/api"
    static final REGISTER_URL_ROOT = "/register"
    static mappings = {
        API_URL_ROOT + "/$controller/$action?/$id?(.$format)?" {
            constraints {

            }
        }

        REGISTER_URL_ROOT (controller: "signup")

        "/"(view: "/index")
        "500"(view: '/error')
        "404"(view: '/notFound')
    }
}
运行此命令时,我只能通过根URL直接调用我的控制器,即,
localhost:8080/login
localhost:8080/signup
,而我希望它是:

localhost:8080/api/v1/login
localhost:8080/register/signup


如何解决此问题?

您可以使用组来分隔不同的api

在你的情况下,可能会变成这样

group("/api") { 
     "/$controller/$action?/$id?(.$format)?" { constraints { } }
     // PUT HERE ALL OTHER API MAPPING
} 

group("/register") { 
    "/$controller" {} 
    // PUT HERE ALL REGISTER MAPPINGS 
} 
如果您需要考虑api的版本,只需这样做

group("/api") {
    "/$namespace/$controller/$action/$id?" {}
    // OR ANY OTHER MAPPING YOU NEED. Then in your controller define
    // static namespace = 'v1' 
    // for example for your v1 controllers.
}
然后,如果需要,可以将组声明为变量

 static API="/api"

 group (API) { .... }

如果对噪音不感到抱歉,希望这会有所帮助

这会有什么帮助?这似乎与我描述的问题没有任何关系,除非我遗漏了什么……我对你问题的回答仍然不令人满意吗?如果没有,你能接受吗