【问题标题】:Grails 3 URLMappings namespaced APIGrails 3 URLMappings 命名空间 API
【发布时间】:2019-07-03 13:44:43
【问题描述】:

我对此感到疑惑,这是我之前遇到的问题,只是使用一堆逐行映射解决了问题。

假设我想要一个带有几个屏幕(页面)的 Grails 3.3 应用程序,使用以下旧/标准映射:

static mappings = {

        "/$controller/$action?/$id?(.$format)?"{
            constraints {
                // apply constraints here
            }
        }
}

但我还想要一个(非常小的)API 样式映射,例如:

static mappings = {
    get "/api/$controller(.$format)?"(action:"index", namespace:'api')
    get "/api/$controller/$id(.$format)?"(action:"show", namespace:'api')
    post "/api/$controller"(action:"save", namespace:'api')
    put "/api/$controller/$id"(action:"updateStatus", namespace:'api')
    patch "/api/$controller/$id"(action:"patch", namespace:'api')
    delete "/api/$controller/$id"(action:"delete", namespace:'api')
}

普通控制器没有命名空间,我希望通过 grails 默认样式访问它们。但我希望 API 可以访问(包括使用 createLink() 等的反向映射,如果可能的话,以保持简单。

我尝试了多种配置,发现以下得到了正向映射(通过 URL 找到控制器和操作),但反向映射始终默认为“/$controller/$action? /$id?(.$format)?"样式链接(我更愿意为这些生成 404,尽管我可以继续访问它)。例如。完整代码为:

class UrlMappings {

    static mappings = {

        get "/api/$controller(.$format)?"(action:"index", namespace:'api')
        get "/api/$controller/(.$format)?"(action:"index", namespace:'api')
        get "/api/$controller/$id(.$format)?"(action:"show", namespace:'api')
        post "/api/$controller"(action:"save", namespace:'api')
        put "/api/$controller/$id"(action:"updateStatus", namespace:'api')
        patch "/api/$controller/$id"(action:"patch", namespace:'api')
        delete "/api/$controller/$id"(action:"delete", namespace:'api')


        "/$controller/$action?/$id?(.$format)?"{
            constraints {
                // apply constraints here
            }
        }


        "/"(view:"/index")
        "500"(view:'/error')
        "404"(view:'/notFound')
    }
}

有没有办法让这个以我想要的方式工作 - 例如有一个反向 URL - 例如createLink(...) 工作?我想我曾经在另一个应用程序上使用过命名映射,但这些似乎很快就失控了。

目前如果我这样做了

"${createLink(namespace:'api', controller:'upload', action:'post')}"

结果是 /upload/post 而我想要的是 /api/upload

最终(希望编辑)- 这似乎比以我不希望使用反向映射的格式出现的 URL 有点大。虽然前向映射仅与控制器一起“​​工作”,但当我打开 Grails Spring 安全性时,我在 URL 的 /api/upload 版本上被拒绝访问,我不是 100% 确定,但查看它出现的日志是因为代码找不到控制器,因此找不到 @Secured 注释。

【问题讨论】:

  • The "normal" controllers don't have any namespace while the API controllers are all namespaced to 'api'. Is there anyway to get this working and have a reverse URL - e.g. createLink(...) work? - 不清楚你所说的“工作”和什么不工作。
  • 啊,我会更新更多代码。目前,我检查并发现正向映射很好,但反向映射不行。
  • 你有createLink(namespace:'api', controller:'upload', action:'post')。您要链接到的控制器中的操作是否命名为post?此外,您的问题中没有足够的信息可以确定,但您可能希望使用 createLink(namespace:'api', controller:'upload', action:'post', method: 'POST') 之类的内容指定 HTTP 方法

标签: grails


【解决方案1】:

好的,所以答案是获取 url 映射报告插件,或者其他人来检查您的代码。

基本上这是我的一个错字,我的最后一个配置在更正后运行良好。

首先 - 使用安全插件,您将获得 404 的 403 插入。

其次,通过 createLink 的反向映射返回一个虚拟 URL,而不是报告错误(例如,如果没有匹配的控制器,例如由于所述错字)。

【讨论】:

  • “首先 - 使用安全插件,您可以获得 404 的 403 插入” - 这通常是可取的,因此您不会像在某些情况下那样暴露“真实”和不真实的内容这样做会被视为安全风险。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多