Как получить результат от вызова WS в play framework/scala?

У меня большие проблемы с получением значения от вызова WS.url.

val x =WS.url("https://www.google.com/recaptcha/api/siteverify?
secret=XX&response="+captcha).get().map {
response =>response.body}

когда я пытаюсь

Console.println("X: "+x)

У меня нет ожидаемого значения, но:

X: scala.concurrent.impl.Promise$DefaultPromise@e17c7c

НО, когда я пытаюсь напечатать значение println(response.body) внутри функции карты, оно работает нормально.

Я также попробовал учебник по playframework, но те же результаты.

Итак, как я могу присвоить результат вызова GET какой-либо переменной?


person user1877249    schedule 01.12.2014    source источник
comment
В результате вызов WS представляет собой Future[WSResponse], поэтому вы не можете получить значение напрямую, не отображая его (если вы не заблокируете). В каком контексте вам это нужно?   -  person Michael Zajac    schedule 01.12.2014
comment
Нужно логическое значение из JSON для проверки ввода   -  person user1877249    schedule 01.12.2014


Ответы (1)


Пожалуйста, не собирайте свою собственную строку запроса, используйте метод withQueryString.

У вашей проблемы есть два решения: блокирующее и неблокирующее. Блокировка будет означать, что поток вашего запроса будет простаивать до завершения HTTP-вызова. Неблокирующий вариант предпочтительнее, и вы можете предоставить Play Future для завершения запроса. Все, что вам нужно сделать, это вместо Action использовать Action.async в вашем контроллере.

val captchaResponse: Future[String] =
  WS.url("https://www.google.com/recaptcha/api/siteverify")
    .withQueryString("secret" -> "XX", "response" -> "captcha")
    .get()
    .map(_.body)

// Non-blocking solution:
captchaResponse.map {
  body =>
    Console.println("X: " + body)
    Ok(views.html.page(body.toBoolean))
}

// Blocking solution:
import scala.concurrent.duration._
val x = Await.result(captchaResponse, 3.seconds)
Console.println(x)
person Akos Krivachy    schedule 01.12.2014