Play for Scala 中的动态路径路由



我在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

您可以使用 SIRD(字符串插值路由 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

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

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

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

与其使用一组重复的路由来引入大量复制/粘贴代码,不如使用基于角色的逻辑。 假设设置了某种会话管理/用户识别机制,那么测试用户可以拥有测试凭据,登录时将具有角色/会话属性来指示仅测试功能。 理想情况下,您将有不同的专用实例,因为它们看起来已经用于不同的事情。

最新更新