假设我有以下路线:
GET /blog/:blogName controllers.blog.show(blogName: String)
GET /blog/:blogName/:postId controllers.blog.getPost(blogName: String, postId: Int)
所以这适用于URLS,如:
www.example.com/blog/corporate
www.example.com/blog/corporate/1231
目标是使用标准路由,但我想以某种方式支持以下内容。 假设我想要一个名为' corporate'的博客的自定义网址。在这个URL工作:
corporate.example.com
corporate.example.com/12321
由于行动只是功能,我希望我能够以某种方式创造一个“全能”#34;然后将该请求简单地代理到现有路由,例如。
示例,网址:corporate.example.com/12321
我想要这样做:
def catchAll(): Action = {
val blogName = request... // extract the subdomain "corporate"
val postId = // ... extract postId from the URL
controller.blog.getPost(blogName, postId)
}
注意:我可能有100个这样的博客,所以我无法将其编码到路线中。这个想法是我想知道我是否可以通过"代理"以某种方式重新使用现有路线。在我自己手动过滤掉网址中的部分后,请求不匹配到正确路线的路线。
答案 0 :(得分:3)
你也许可以定义这样的路线:
# These two routes can do the "proxying"
GET / controllers.blog.view
GET /:postId controllers.blog.catchAll(postId: Int)
# These can be your fallback routes
GET /blog/:blogName controllers.blog.show(blogName: String)
GET /blog/:blogName/:postId controllers.blog.getPost(blogName: String, postId: Int)
然后在博客控制器中,您的“代理”功能:
def view = Action.async { request =>
// request.host = "subdomain.example.com" in your example, though it may be wiser to try a more sophisticated function with a regex to handle the extraction.
val subdomain: String = request.host.split('.').head
show(subdomain)(request)
}
def catchAll(postId: Int) = Action.async { request =>
val subdomain: String = request.host.split('.').head
getPost(subdomain, postId)(request)
}
由于控制器函数show
和getPost
返回Action
,当应用的是函数Request => Future[Result]
时,我们只将原始请求传递给Action.apply
}。
请注意,由于Action.apply
返回Future
,我需要更改view
和catchAll
以使用Action.async
来处理Future[Result]
。