【问题标题】:How do I correctly map versioned resources in Grails?如何在 Grails 中正确映射版本化资源?
【发布时间】:2015-01-23 22:33:10
【问题描述】:

我有运行 REST API 并在 URL 中使用版本号的 grails,如下所示:https://api.mycompany.com/v2/metadata。我需要更改其中一个端点的参数,所以我将版本升级到v3。只有一个控制器受到影响,所以我想将剩余的调用委托给v2 的控制器,而不必再次复制/粘贴所有内容。这是我UrlMappings.groovy的相关部分:

class UrlMappings {

    static mappings = {

        "/v3/widget"(controller: "v3widget")
        "/v3/$otherResource" {
            // does not work, but illustrates what I want to happen
            uri = { "/v2/" + params.otherResource }
        }


        // rest of my file...
        "/v2/metadata"(controller: 'metadata')
...

这样做的正确方法是什么?我正在使用 grails 2.2.5

【问题讨论】:

    标签: rest grails


    【解决方案1】:

    我会在 uri 路径中使用一个变量,而不是您的示例,您将拥有以下映射:

    class UrlMappings {
    
        static mappings = {
    
            "/$apiVersion/widget"(controller: "v3widget")
            "/$apiVersion/otherResource"(controller: "otherResource")
            // rest of my file...
            "/$apiVersion/metadata"(controller: 'metadata')
    ...
    

    然后你可以检查控制器中的值:

    class OtherResourceController {
    
        def index(){
            if(params.apiVersion == 'v2') {
              ...
            } else {
              ...
            }
        }
    
    }
    

    这里的示例是检查字符串值,但您可以更深入一点,将字符串值实际转换为内部 api 版本枚举表示,这可能更容易管理。您也可以在过滤器中执行此操作。

    这样您可以增加逻辑更改,并且 api 将有一个很好的回退,将委托给默认版本。

    但是当你有几个 api 版本一个层叠一个时,它会变得非常卷曲。

    【讨论】:

      【解决方案2】:

      我发现可行的解决方案依赖于通配符映射也可以接受其他正则表达式这一事实:

      class UrlMappings {
      
          static mappings = {
      
              // v3 specific
              "/v3/widget"(controller: "v3widget")
              // v3/v2 common
              "/v[23]/$otherResource" {
                  // normal mappings go here
              }
              // v2 specific
              "/v2/metadata"(controller: 'v2metadata')
      ...
      

      此解决方案效果很好,因为我不必重复任何映射,并且很清楚 v2 和 v3 资源之间的不同之处。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        • 2016-09-24
        • 2015-12-11
        • 2012-02-18
        相关资源
        最近更新 更多