在 Play 中使用 WS 使用服务

Consuming a service using WS in Play

我希望有人能简要介绍一下使用服务的各种方式(这个只是 returns 一个字符串,通常是 JSON 但我只是想了解这里的概念).

我的服务:

def ping = Action {
  Ok("pong")
}

现在在我的 Play (2.3.x) 应用程序中,我想调用我的客户端并显示响应。

使用 Futures 时,我想显示值。 我有点困惑,我可以通过哪些方式调用此方法,即我看到有一些使用 Success/Failure、

的方法
val futureResponse: Future[String] = WS.url(url + "/ping").get().map { response =>
          response.body
 }
var resp = ""
futureResponse.onComplete {
  case Success(str) => {
    Logger.trace(s"future success $str")
    resp = str
  }
  case Failure(ex) => {
    Logger.trace(s"future failed")
    resp = ex.toString
  }
}

Ok(resp)

我可以在 success/failure 的 STDOUT 中看到跟踪,但我的控制器操作只是 returns“”到我的浏览器。

我明白这是因为它 returns 一个 FUTURE 并且我的操作在 Future returns 之前完成。

如何强制等待? 我有哪些错误处理选项?

如果您真的想在功能完成之前一直阻塞,请查看 Future.ready()Future.result() 方法。但你不应该。

关于Future的要点是你可以告诉它在结果到达后如何使用,然后继续,不需要块。

Future 可以是 Action 的结果,在这种情况下框架会处理它:

def index = Action.async {
  WS.url(url + "/ping").get()
    .map(response => Ok("Got result: " + response.body))
}

documentation,题目描述的很好

关于错误处理,可以使用Future.recover()方法。你应该告诉它 return 以防出错,它会为你提供新的 Future 你应该 return 从你的行动中。

def index = Action.async {
  WS.url(url + "/ping").get()
    .map(response => Ok("Got result: " + response.body))
    .recover{ case e: Exception => InternalServerError(e.getMessage) }
}

因此,您使用服务的基本方式是获取结果 Future,通过使用单子方法(return 新转换 Future 的方法以您想要的方式转换它,像 maprecover 等...) 和 return 它是 Action.

的结果

您可能想查看 Play 2.2 -Scala - How to chain Futures in Controller Action and Dealing with failed futures 个问题。