【发布时间】:2012-04-10 01:15:33
【问题描述】:
问题文本/背景和发现
我的浏览器会向我在 play 2.0 框架中构建的应用程序发送一些 HTTP 标头(例如referer)。我完全不知道如何阅读它们,所以我可以传递它们(谷歌没有帮助)。
我认为我可能需要做一些这里提到的事情 (http://www.playframework.org/documentation/2.0/ScalaInterceptors)。结果是:
override def onRouteRequest(request: RequestHeader): Option[Handler] = {
println("headers:" + request.headers.toString)
super.onRouteRequest(request)
}
哪个可以输出到控制台。但我不知道如何将它们传递给特定的控制器动作。例如,我可以添加一个if 语句并在它看到特定的“路线”(例如/client/view/123)后调用myAction,否则调用super.onRouteRequest(request)。但我会失去/conf/routing 中的功能。这样做的“正确”方式是什么?
在我的回答中,我找到了this:Http.Context.current().request(),但在我的控制器操作中使用它给了我一个[RuntimeException: There is no HTTP Context available from here.]。
我发现的另一件事是 this Guillaume Bort 回复了一个我认为不相关的问题:
I'm not sure what you are trying to do but:
case class CustomRequest(token: String, request: Request[AnyContent])
extends WrappedRequest(request)
case class CustomAction(f: CustomRequest => Result)
extends Action[AnyContent] {
lazy val parser = BodyParsers.parse.anyContent
def apply(req: Request[AnyContent]) = req match {
case r: CustomRequest => f(r)
case _ => sys.error("Invalid usage")
}
}
object Application extends Controller {
def index = CustomAction { request =>
Ok("Token: " + request.token)
}
}
With onRouteRequest:
override def onRouteRequest(req: RequestHeader) = {
super.onRouteRequest(req).map { _ match {
case a: CustomAction => Action { (request: Request[AnyContent]) =>
a(CustomRequest("XXX", request))
}
case o => o
}
}
}
但这对我来说有点过头了(甚至可能不是我的问题的答案)。但如果这是要走的路,请告诉我。
问题总结
在控制器操作中读取浏览器发送的 HTTP 标头的正确/好方法是什么?我只关心/需要少数路由中的 HTTP 标头。
感谢任何指点或轻推!
PS: 1)我是 scala 和 play 的新手(以及通过框架之类的 rails 在 web 上开发),所以我对任何术语错误表示歉意(请告诉我)。 2)stackoverflow的新手......但它看起来很糟糕,希望我在这里的第一个问题一切正常! 3) 我有 5 个链接/发现,但没有声誉允许这样做,所以将我的问题缩小到 3 个有趣的网络发现,抱歉。
【问题讨论】:
-
+1 太糟糕了,似乎没有直接的方法可以通过 onRouteRequest 将数据注入到请求中(是的,WrappedRequest 允许这样做,但是当您需要将变量注入到每个路由的请求中时,不管行动,onRouteRequest 肯定会是一个很好的地方......)
-
能否请您重述本文顶部的问题?像 TL;DR 我正在尝试做的事情(等等)?很难解析出主要问题是什么。