【问题标题】:How to get result from WS call in play framework/scala?如何在 play framework/scala 中获取 WS 调用的结果?
【发布时间】:2014-12-01 01:05:14
【问题描述】:

我很难从 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

但是,当我尝试在 map 函数中打印值 println(response.body) 时,它工作正常。

我也尝试了 playframework 教程,但结果相同。

那么,如何将 GET 调用的结果分配给某个变量?

【问题讨论】:

  • 结果是WS调用是Future[WSResponse],所以不映射就不能直接获取值(除非你阻塞)。在什么情况下你需要它?
  • 需要来自 JSON 的 bool 值用于输入验证

标签: web-services scala playframework playframework-2.3


【解决方案1】:

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

您的问题有两种解决方案:阻塞和非阻塞。阻塞意味着您的请求线程将空闲,直到 HTTP 调用完成。非阻塞是首选,您可以向 Play 提供 Future 以完成请求。您所要做的就是在您的控制器中使用Action.async 而不是Action

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多