在Play中使用WS来使用服务

时间:2015-03-15 02:26:10

标签: scala future playframework-2.3

我希望有人可以简单介绍一下使用服务的各种方法(这个只返回一个字符串,通常是JSON,但我只是想了解这里的概念)。

我的服务:

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

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

使用期货时,我想显示价值。 我有点困惑,有什么办法可以称之为这种方法,即我有一些方法可以看出使用成功/失败,

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)

我可以在STDOUT中看到成功/失败的跟踪,但我的控制器操作只是将“”返回到我的浏览器。

我理解这是因为它返回了未来,我的行动在未来返回之前结束。

我该怎么强迫它等? 我有哪些错误处理选项?

1 个答案:

答案 0 :(得分:2)

如果您确实要阻止功能完成,请查看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()方法。如果出现错误,您应该告诉它要返回什么,并且它会为您提供新的Future,您应该从行动中返回。

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

因此,您使用服务的基本方式是获取结果Future,使用monadic方法(返回新转换的Future的方法,如map)以您希望的方式对其进行转换,recover等。)并将其作为Action的结果返回。

您可能需要查看Play 2.2 -Scala - How to chain Futures in Controller ActionDealing with failed futures个问题。