更改Grails REST格式/ controller / <id> / <action> </action> </id>

时间:2013-02-21 15:21:02

标签: grails

我昨天对此有点乱,并且悲惨地失败了。我想转换:

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

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

最明显的方法是失败"/$controller/$action?/$id?"

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

我的问题是两部分:

  1. 如何使用真正的正则表达式定义URL资源。
  2. 如何将“组”绑定到变量。换句话说,如果我定义一个正则表达式,我如何将它绑定到一个变量,如$ controller,$ id,$ action
  3. 我还希望能够支持.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+/)
            }
        }
    

1 个答案:

答案 0 :(得分:2)

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映射中以任何方式使用正则表达式的方法,但您可以使用以下事实获得正向映射:您可以为在以下位置评估的参数值指定闭包运行时可以访问其他参数:

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

表示&#34;如果设置了b,则将其用作操作,将a用作id,否则使用a作为操作并设置{ {1}}到id&#34;。但是这不会给你一个很好的反向映射,即null不会生成任何合理的东西,你必须使用createLink(controller:'foo', action:'bar', id:1)

修改

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

createLink(controller:'foo', params:[a:1, b:'bar'])

使用补充

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

使用负前瞻来确保两个映射是不相交的。