在 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
的方法以您想要的方式转换它,像 map
、recover
等...) 和 return 它是 Action
.
的结果
您可能想查看 Play 2.2 -Scala - How to chain Futures in Controller Action and Dealing with failed futures 个问题。
我希望有人能简要介绍一下使用服务的各种方式(这个只是 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
的方法以您想要的方式转换它,像 map
、recover
等...) 和 return 它是 Action
.
您可能想查看 Play 2.2 -Scala - How to chain Futures in Controller Action and Dealing with failed futures 个问题。