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