我在PathBindable上阅读了这个文档。
如果我有这样的路线:
GET /user/:user/posts/:postId controllers.BinderApplication.post(user: scalaguide.binder.models.Post)
我如何能够在 Post 对象中捕获这两个参数。
后类看起来像这样
case class Post(postId: Long, userId: Long)
我知道我可以使用QueryStringBindable,但我想知道是否有办法使用路径参数。
在这种情况下,良好做法将是一个行动组合或只是一个行动。
路线:
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 方法来检索用户实例; 请注意,在现实世界中,这种方法应该是轻量级的,而不是 例如.DB涉及访问,因为代码是在服务器IO上调用的 线程,并且必须完全非阻塞。
因此,例如,您可以使用简单对象标识符作为路径 可绑定,并使用操作组合检索实际值。
还有一些来自Greg Methvin(Lightbend工程师)的建议: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/play-framework/b1fF2EdmCJ8/F2mX1EflJAAJ
不过,如果你想做这样的技巧,你可以使用字符串插值路由DSL