从Play框架(Scala)中的play.api.mvc.Action [AnyContent]获取响应正文

Zur*_*iar 10 scala playframework

我有以下Play(Scala)代码:

object Experiment extends Controller {

 //routes file directs /genki here
 def genki(name: String) = Action(pipeline(name))

 def pipeline(name: String) = {
   req:play.api.mvc.RequestHeader => {
      val template = views.html.genki(name)
      Experiment.Status(200).apply(template).as("text/html")
   }
 }

 def simple = Action {
   SimpleResult(
      header = ResponseHeader(200, Map(CONTENT_TYPE -> "text/plain")),
      body = Enumerator("Hello World!".getBytes())
   )
 }

}
Run Code Online (Sandbox Code Playgroud)

这编译好并按预期工作.

使用scala REPL如何显示实际的html?

我有:

 scala> val action = simple
 action: play.api.mvc.Action[play.api.mvc.AnyContent] = Action(parser=BodyParser(anyContent))    
Run Code Online (Sandbox Code Playgroud)

我认为现在REPL中的值引用'action'是一个Action对象,它是AnyContent的类型约束(这是正确的说法吗?).

我现在如何使用此Action打印出Http Response html内容?

非常感谢

Hug*_*ugh 6

而不是vptheron描述的手动结果提取,您可以使用play.api.test.Helpers:

import play.api.test.Helpers._
val result: Future[SimpleResult] = …
val bodyAsBytes: Array[Byte] = contentAsBytes(result)
Run Code Online (Sandbox Code Playgroud)

还有contentAsString等等


Jus*_*s12 6

Huw答案的基础上,这是完整的工作代码:

import play.api.test._  
def getStringFromAction(action:Action[AnyContent]):String = {
  val request = new FakeRequest("fakeMethod", "fakeUrl", new FakeHeaders, "fakeBody")
  val result = action.apply(request).run
  import scala.concurrent.duration._
  Helpers.contentAsString(result)(1000 millis)
}
Run Code Online (Sandbox Code Playgroud)

您将需要包括以下内容库(不包括默认情况下播放): ,play-test_2.11.jar,selenium-java.jar,selenium-api.jar,selenium-chrome-driver.jar,selenium-firefox-driver.jar,selenium-remote-driver.jar,,selenium-htmlunit-driver.jar 和.这些可在Play或Activator发行版中找到.您还可以在build.sbt中添加依赖项,如此处所述.fluentlenium-core.jarhtmlunit-core-js.jarhtmlunit.jar


vpt*_*ron 2

Action没有内容,因为它是一个可以用来应用 aRequest并获取结果的对象。

val request: Request[A] = ... // create a request instance
val resultFuture: Future[SimpleResult] = simple(request)

val bodyAsBytes: Array[Byte] = Await.result(Await.result(resultFuture, timeout.duration).body |>>> Iteratee.consume[Array[Byte]](), timeout.duration)
Run Code Online (Sandbox Code Playgroud)

请注意,对于您的示例,空请求就足够了,因为您不使用它。

另外,请注意,bodyfromSimpleResult是 an Enumerator,您需要Iteratee对其应用 an ,这里我只是应用一个消费者来获取整个列表。Await.result使用2个:

  1. 等待Future[SimpleResult]完成
  2. 等待完成Enumerator向 发送数据Iteratee