我必须对服务进行多次REST调用才能获取有关多个资源的信息。一旦所有资源信息都可用,我需要以某种方式加入它们。
你能指点我正确的Scala / play构造吗?
答案 0 :(得分:1)
Future
撰写 for-comprehension :
for {
sugar <- getSugar
lemons <- getLemons
lemonJuice <- pressLemons(lemons)
water <- getWater
} yield {
makeLemonade(sugar, lemonJuice, water)
}
Daniel Westheide对此有一个很棒的tutorial。
答案 1 :(得分:1)
对于Play
上的REST客户端功能,Play WS doc中有相当详细的文档。您可以使用for-comprehension
链接您的REST调用并处理相应的响应,如以下示例所示,借用此Play WS section:
val futureResponse: Future[WSResponse] = for {
responseOne <- ws.url(urlOne).get()
responseTwo <- ws.url(responseOne.body).get()
responseThree <- ws.url(responseTwo.body).get()
} yield responseThree
futureResponse.recover {
case e: Exception =>
val exceptionData = Map("error" -> Seq(e.getMessage))
ws.url(exceptionUrl).post(exceptionData)
}
答案 2 :(得分:0)
Leo和Mario的解释就足够了,但是如果您想获得更高性能和并行运行的代码,可以参考以下代码段:
def prepareCappuccino(): Future[Cappuccino] = {
val groundCoffee = ws.url("url1").get()
val heatedWater = ws.url("url2").get()
val frothedMilk = ws.url("url3").get()
for {
ground <- groundCoffee
water <- heatedWater
foam <- frothedMilk
espresso <- brew(ground, water)
} yield combine(espresso, foam)
}
通过这样定义将来的调用,可以使每个将来的调用在并行线程中异步执行,并且对n个调用的运行速度约为n-times
,而不是直接将其用于理解。
之所以发生这种情况,是因为对于理解糖的嵌套平面地图和地图调用,以及形成的管道导致阻塞和同步API调用,如果您未事先定义期货,scala必须按原样解释它们。
Here是Linked-in团队负责游戏框架开发的有趣文章。
要使用Web客户端,您可以轻松地在官方documentation中查找。