【问题标题】:RESTful grails application: DRYing up UrlMappingRESTful grails 应用程序:干掉 UrlMapping
【发布时间】:2009-06-05 12:29:05
【问题描述】:

假设我们有一个公开多个资源的 grails Web 应用程序。

  • 标签
  • 网址
  • 用户

该应用程序有一个经典的网络界面,用户可以与之交互并进行一些管理。 我们希望通过 RESTful API 将应用程序中的资源公开给客户端,并且我们不希望应用程序的这一部分弄乱我们已有的控制器和代码。 所以我们想出了以下内容:

如果 Web 界面提供 host/app_path/url/[list|show|create],我们希望 REST API 位于 /host/app_path/rest/url

所以我们最终得到了以下 UrlMappings 文件:

class UrlMappings {
static mappings = {
    "/$controller/$action?/$id?"{

    }

    /* adding new urls and listing them */
    "/rest/url"{
        controller = "urlRest"
        action = [POST: "save", PUT: "save", GET: "list", DELETE:"error"]
    }

    /* accessing a single url */
    "/rest/url/$id"{
        controller = "urlRest"
        action = [POST: "update", PUT: "update", GET: "show", DELETE: "delete"]
    }

    /* non-crud stuff on urls */
    "/rest/url/$action?/$id?"{
        controller = "urlRest"
    }

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

问题是,这并不是这里最干燥的东西。随着我们添加更多资源(例如标签),情况变得更糟。它们将转换为另外三个非常相似的代码块......

非crud功能将是诸如使用特定标准搜索之类的......

我们尝试使用循环生成映射闭包,但没有成功。我们在这里完全走错了吗?

【问题讨论】:

    标签: grails groovy dry url-mapping


    【解决方案1】:

    我会推荐以下映射:

    "/rest/url/$id?"(resource:"urlRest")
    

    下面是为 urlRestController 创建的 HTTP 方法到操作映射:

    GET         show
    PUT         update
    POST        save
    DELETE      delete
    

    我明白为什么您可能希望映射 /rest/url POST 来保存和 /rest/url/id PUT 来更新,但这与这些动词的含义背道而驰。 PUT 应该是添加新 url 的唯一方法,而 POST 应该是更新 url 的唯一方法。如果您的约束是保持当前控制器代码不变,那么按照您布置的方式进行操作可能是最好的方法。但是,我的猜测是你的控制器可能已经被编码来处理默认映射就好了(如果没有 id,更新/删除会给出错误,如果没有 id,则显示重定向到列表等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多