更改Grails REST格式/控制器//

我昨天搞砸了这一点,悲惨地失败了.我想转换:

"/$controller/$action?/$id?"

#in psudo
"/$controller/$id?/$action?"
#ideal regex
"\/(\w+)(\/\d+)?(\/\w+)?" 

最明显的方式是“/ $controller / $action?/ $id?”

我可以编写正则表达式来做到这一点,但我找不到使用真正的正则表达式的方法(我发现RegexUrlMapping但无法找到如何使用它),也无法找到有关如何分配组的文档一个变量.

我的问题是两部分:

>如何使用真正的正则表达式定义URL资源.
>如何将“组”绑定到变量.换句话说,如果我定义一个正则表达式,我如何将它绑定到像$controller,$id,$action这样的变量

我还希望能够支持.json表示法/user/id.json

我试过的其他事情,我认为可行的:

"/$controller$id?$action?"{
        constraints {
            controller(matches:/\w+/)
            id(matches:/\/\d+/)
            action(matches:/\/\w+/)
        }
    }

还尝试过:

"/$controller/$id?/$action?"{
        constraints {
            controller(matches:/\w+/)
            id(matches:/\d+/)
            action(matches:/\w+/)
        }
    }

最佳答案 grails处理这个问题的方法是设置

grails.mime.file.extensions = true

在Config.groovy中.这将导致Grails在应用URL映射之前剥离文件扩展名,但使其可供withFormat使用

def someAction() {
  withFormat {
    json {
      render ([message:"hello"] as JSON)
    }
    xml {
      render(contentType:'text/xml') {
        //...
      }
    }
  }

为此你只需要一个“$controller / $id?/ $action?”的URL映射.

我不知道在URL映射中以任何方式使用正则表达式的方法,但您可以使用以下事实来获得正向映射:您可以为在运行时获得的参数值指定闭包,并且可以访问其他参数:

"$controller/$a?/$b?" {
  action = { params.b ?: params.a }
  id = { params.b ? params.a : null }
}

其中说“如果设置了b,则将其用作动作,将其用作id,否则使用a作为动作并将id设置为null”.但这不会给你一个很好的反向映射,即createLink(控制器:’foo’,action:’bar’,id:1)不会生成任何合理的东西,你必须使用createLink(控制器:’foo) ‘,params:[a:1,b:’bar’])

编辑

你可以尝试的第三种可能性是结合

"/$controller/$id/$action"{
    constraints {
        controller(matches:/\w+/)
        id(matches:/\d+/)
        action(matches:/\w+/)
    }
}

映射与补充

"/$controller/$action?"{
    constraints {
        controller(matches:/\w+/)
        action(matches:/(?!\d+$)\w+/)
    }
}

使用负向前瞻以确保两个映射是不相交的.

点赞