Scala中Play的动态路径路由

时间:2018-03-11 15:38:59

标签: scala playframework playframework-2.0 playframework-2.5

我在routes文件中定义了300个条目,如下所示:

GET /url001 MyClass.myMethod

适用于http://localhost:9000/url001

等网址

现在,我需要为这300个链接定义两个环境,用于生产和测试。链接就像:

http://localhost:9000/prod/url001

用于生产(参见路径中的prod

http://localhost:9000/test/url001

进行测试(参见路径中的test)。

我希望routes中有一组链接,如何在Play中实现?我知道我可以在路径中定义变量,例如path/:var,但我需要的是设置相对URL。

注意:有些用户可能正在使用prod,有些用户可能同时使用test

2 个答案:

答案 0 :(得分:2)

您可以使用SIRD(String Interpolating Routing DSL): https://www.playframework.com/documentation/2.6.x/ScalaSirdRouter#Binding-sird-Router

您需要在scala源中描述这30个条目,然后在路由中执行这两个记录并将它们绑定到scala自定义路由器。

自定义路由器将如下所示:

package my.app

import javax.inject.Inject

import play.api.mvc._
import play.api.routing.Router.Routes
import play.api.routing.SimpleRouter
import play.api.routing.sird._

class MainRouter @Inject()(controller: ApiController)
  extends SimpleRouter
{
  override def routes: Routes = {
    case GET(p"/url001") => MyClass.myMethod001
    case GET(p"/url002") => MyClass.myMethod002
  }
}

conf/routes将如下所示:

/prod                        my.app.MainRouter
/test                        my.app.MainRouter

仍然,你需要以某种方式了解应用程序内部的内容,我不知道你的想法是什么 - 会话(cookies)或令牌或......

  

因为测试环境不会用于实际测试系统。这是一个商业智能应用程序,用户将在将它们迁移到生产之前测试它们构建的查询。从系统的角度来看,产品和测试都是生产。从用户的角度来看,prod和test是不同的环境

在这种情况下,我会建议您创建两个不同的分期付款。

答案 1 :(得分:1)

可能最好有一个基于角色的逻辑,而不是像重复路由一样会引入大量的复制/粘贴代码。 假设存在某种会话管理/用户识别机制,则测试用户可以拥有测试凭据,登录时将具有角色/会话属性以指示仅测试功能。 理想情况下,您将拥有不同的专用实例,因为它们看起来已经被用于不同的事物。

相关问题