我希望有人可以简单介绍一下使用服务的各种方法(这个只返回一个字符串,通常是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中看到成功/失败的跟踪,但我的控制器操作只是将“”返回到我的浏览器。
我理解这是因为它返回了未来,我的行动在未来返回之前结束。
我该怎么强迫它等? 我有哪些错误处理选项?
答案 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 Action和Dealing with failed futures个问题。