我有运行 REST API 并在 URL 中使用版本号的 grails,如下所示:https://api.mycompany.com/v2/metadata
.我需要更改其中一个端点的参数,所以我将版本升级到 v3
.只有一个 Controller 受到影响,所以我想将剩余的调用委托(delegate)给 v2
的 Controller 。无需再次复制/粘贴所有内容。这是我的 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
最佳答案
我将在 uri 路径中使用一个变量,而不是您的示例,您将拥有以下映射:
class UrlMappings {
static mappings = {
"/$apiVersion/widget"(controller: "v3widget")
"/$apiVersion/otherResource"(controller: "otherResource")
// rest of my file...
"/$apiVersion/metadata"(controller: 'metadata')
...
然后您可以检查 Controller 中的值:
class OtherResourceController {
def index(){
if(params.apiVersion == 'v2') {
...
} else {
...
}
}
}
此处的示例是检查字符串值,但您可以更深入一点,将字符串值实际转换为内部 api 版本枚举表示,这可能更易于管理。您也可以在过滤器中执行此操作。
通过这种方式,您可以增加逻辑更改,并且 api 将有一个很好的回退,将委托(delegate)给默认版本。
但是当你有几个 api 版本一个层叠一个时,它会变得非常 curl 。
关于rest - 如何在 Grails 中正确映射版本化资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28119833/