Как прочитать в браузере HTTP-заголовок, отправленный для воспроизведения в действие контроллера? - PullRequest
3 голосов
/ 26 марта 2012

Текст вопроса / фона и находки

Мой браузер отправляет некоторый HTTP-заголовок (например, реферер) моему приложению, которое я создаю в рамках платформы Play 2.0. Я совершенно не понимаю, как их читать, чтобы я мог передать их (Google не помогает).

Я думаю Возможно, мне нужно сделать что-то, упомянутое здесь (http://www.playframework.org/documentation/2.0/ScalaInterceptors). Что привело к:

override def onRouteRequest(request: RequestHeader): Option[Handler] = {
   println("headers:" + request.headers.toString)
   super.onRouteRequest(request)
}

Который работает вывод на консоль. Но я не знаю, как передать их конкретному действию контроллера. Я мог бы, например, добавить оператор if и вызвать myAction, как только он увидит определенный «маршрут» (например, / client / view / 123), или вызвать super.onRouteRequest(request) в противном случае. Но я потерял бы функциональность в моем /conf/routing. Каков «правильный» способ сделать это?

В моем задании ответить, что я нашел это : Http.Context.current().​request(), но использование этого в моем действии контроллера дало мне [RuntimeException: There is no HTTP Context available from here.].

Еще одна вещь, которую я нашел, это это , где Гийом Борт отвечает, я думаю несвязанный вопрос:

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 (и разработке в сети через рельсы, такие как фреймворки), поэтому я приношу свои извинения за любые ошибки в lingo (скажу). 2) Впервые в stackoverflow ... но это выглядит потрясающе, надеюсь, я сделал все в порядке для моего первого вопроса здесь! 3) У меня было 5 ссылок / находок, но нет репутации, чтобы позволить это, поэтому я сузил свой вопрос до 3-х интересных веб-поиска, извините.

1 Ответ

3 голосов
/ 26 марта 2012

Вы можете прочитать заголовки, используя примеры здесь .

По существу:

package controllers

import play.api.mvc._

object Application extends Controller {

  def index = Action {
    request =>
    // your code that reads request.headers here
    Ok("Got request [" + request + "]")
  }

}

Вы можете изменить заголовки в ответе, используя этот пример .

...