Grails 3 URLMappings命名空间API

时间:2019-07-03 13:44:43

标签: grails

我对此很纳闷,这是我之前遇到的,只是解决了很多行与行之间的映射问题。

说我想使用旧的/标准映射的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')
    }
}

是否有按照我想要的方式使它工作的方法-例如具有反向网址-例如createLink(...)工作吗?我认为在其他应用程序的某个时刻,我使用了命名映射,但是这些似乎很快就失去了作用。

目前可以的话

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

当我想要的是/ api / upload时,结果是/ upload / post

最终(希望编辑)-这似乎比仅以我不希望使用反向映射的格式出现的URL更大。当仅使用控制器进行前向映射“工作”时,当我打开Grails Spring安全性时,我无法获得对URL的/ api / upload版本的访问权限,但我不是100%肯定,但是查看它显示的日志是因为代码无法找到控制器,因此无法找到@Secured注释。

1 个答案:

答案 0 :(得分:0)

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

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

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

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