如何在Play框架/ scala中获取WS调用的结果?

时间:2014-12-01 01:05:14

标签: web-services scala playframework playframework-2.3

从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调用的结果分配给某个变量?

1 个答案:

答案 0 :(得分:2)

请不要使用withQueryString方法组装自己的查询字符串。

您的问题有两种解决方案:阻止和非阻止。阻止意味着您的请求的线程将在HTTP调用完成之前空闲。首选非阻止功能,您可以向Play提供Future来完成请求。您只需在控制器中Action使用Action.async而不是{/ p>}

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)