Получить тело ответа из play.api.mvc.Action [AnyContent] в структуре воспроизведения (Scala)
У меня есть следующий код воспроизведения (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())
)
}
}
Это компилируется отлично и работает как ожидалось.
Используя scala REPL, как я могу отобразить фактический html?
У меня есть:
scala> val action = simple
action: play.api.mvc.Action[play.api.mvc.AnyContent] = Action(parser=BodyParser(anyContent))
который я подразумеваю, что теперь ссылка ссылки на действие в REPL является объектом Action, который ограничен типом для AnyContent (это правильный способ сказать это?).
как я могу теперь использовать это действие для вывода содержимого httml Http Response?
Большое спасибо
Ответы
Ответ 1
Вместо того, чтобы описывать извлечение ручного результата vptheron, вы можете использовать play.api.test.Helpers
:
import play.api.test.Helpers._
val result: Future[SimpleResult] = …
val bodyAsBytes: Array[Byte] = contentAsBytes(result)
Там также contentAsString
и т.д.
Ответ 2
Основываясь на ответе от 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)
}
Вам нужно будет включить следующие библиотеки (не включенные по умолчанию в Play): 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
, fluentlenium-core.jar
, htmlunit-core-js.jar
и htmlunit.jar
. Они доступны в дистрибутиве Play или Activator. Вы также можете добавить зависимость в файле build.sbt как здесь.
Ответ 3
Action
не имеет содержимого, так как это объект, который вы можете использовать для применения Request
и получить результат.
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)
Обратите внимание, что для вашего примера достаточно пустого запроса, так как вы его не используете.
Также обратите внимание, что body
из SimpleResult
является Enumerator
, вам нужно применить к нему Iteratee
, здесь я просто применяю потребитель для получения всего списка. Используются 2 Await.result
:
- ждать завершения
Future[SimpleResult]
- ожидать завершения
Enumerator
отправки данных в Iteratee
.