我在PathBindable上阅读了this doc。
如果我有这样的路线:
GET /user/:user/posts/:postId controllers.BinderApplication.post(user: scalaguide.binder.models.Post)
我如何能够捕获Post对象中的两个参数。
帖子类看起来像这样
case class Post(postId: Long, userId: Long)
我知道我可以使用QueryStringBindable,但我想知道是否有办法使用路径参数。
答案 0 :(得分:1)
在这种情况下,良好做法将是行动组合或只是行动。
路线:
GET /user/:userId/posts/:postId controllers.HomeController.post(userId: Long, postId: Long)
控制器:
def post (postId: Long, userId: Long) = Action{
val user = Post(postId, userId) //some massive operation, could be async, then use Action.async
Ok(user.toString())
}
要构建Post
,您需要获取用户和帖子ID;这似乎是一次非常庞大的操作。在IO线程上播放绑定路由,因此您将通过在此处执行大量操作来阻止所有请求。
在此示例中,调用findById方法来检索User实例; 请注意,在现实世界中,这种方法应该是轻量级的而不是 涉及例如数据库访问,因为代码是在服务器IO上调用的 线程,必须完全无阻塞。
因此,您将使用简单对象标识符作为路径 可绑定,并使用动作组合检索实际值。
还有一些提议来自Greg Methvin(Lightbend工程师)的建议:https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/play-framework/b1fF2EdmCJ8/F2mX1EflJAAJ
但是,如果你想做这样的技巧,你可以使用String Interpolating Routing DSL