Scala:多次休息调用服务

时间:2018-05-26 19:21:46

标签: scala playframework

我必须对服务进行多次REST调用才能获取有关多个资源的信息。一旦所有资源信息都可用,我需要以某种方式加入它们。

你能指点我正确的Scala / play构造吗?

3 个答案:

答案 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中查找。