rest - 如何在 Grails 中正确映射版本化资源?

标签 rest grails

我有运行 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/

相关文章:

node.js - 使用 Node.js 将 RESTful 服务与主要网站架构分离

RESTful 多对多可能吗?

spring - Grails:声明式事务

date - 在 Grails Prod 应用程序上遇到错误的日期

grails - 在Grails 3.x中使用JPA注释进行映射

hibernate - 在生产环境上部署Grails。 (Hibernate尝试更新架构)

java - 为什么在android应用中使用jdbc是错误的?

java - 尝试使用 REST 生成 JSON 时出现 HTTP 500 错误

java - 使用外部枚举定义从 JAX-RS 端点生成 Swagger

grails - Grails使用命令对象和同一gsp中的对象