【问题标题】:Add a prefix to a bunch of urls为一堆 url 添加前缀
【发布时间】:2014-02-03 03:58:10
【问题描述】:

我有一堆具有相同前缀的路由:

# with prefixes
GET         /api/v1.0/action1   controllers.Api.action1
GET         /api/v1.0/action2   controllers.Api.action2
GET         /api/v1.0/action3   controllers.Api.action3
GET         /api/v1.0/action4   controllers.Api.action4

# normal urls
GET         /action1   controllers.Home.action1
GET         /action2   controllers.Home.action2

我想摆脱/api/v1.0/ 的重复。 url 必须保持不变,我只是不想为 route 文件中的每个 url 手动编写它们。在 Rails 中是可能的。有什么办法吗?

【问题讨论】:

  • 如果你有这样简单的例子,试试:GET /api/v1.0/:action controllers.Api.action(action:String) 并在控制器中调度:def action(action:String) = Action { def method:java.lang.reflection.Method = getMethodFromNameOrMap(action); method.invoke()}
  • @ajozwik,由于反射会很慢
  • 如果您使用缓存映射(将操作名称映射到方法) - 它将比正常调用慢两倍。但成本随着 JVM 的每个实现而降低。
  • 很抱歉没有给你一个完整的答案,但是你看过詹姆斯罗珀的blog post on advanced routing。基本上你可以在 Scala 中编写路由,这意味着你拥有编程语言的全部功能以避免重复自己。

标签: scala playframework routing playframework-2.2


【解决方案1】:

正如 Rich 所提到的,您可以在 James Ropers' post 之后为这些操作实现自己的路由器。这样做,您可以将以下内容添加到您的路由文件中:

->  /api/v1.0   YourPathBindableController   

您也可以使用插件,例如navigator,它为您提供高级路由。然后,您的导航器路线文件将包含以下内容:

   // Namespace ...
namespace("api"){
  namespace("v1"){
    GET on "index" to Application.index _
  }
}

// ... or with reverse routing support
val api = new Namespace("api"){
  val v2 = new Namespace("v2"){
    val about = GET on "about" to Application.about _
  }
}

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 2015-12-03
    • 1970-01-01
    • 2015-10-03
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多