在 Playframework 上调用 2 个 REST 服务来编写响应

Invoke 2 REST services on Playframework to compose a response

我在 Playframework 上调用 Web 服务时遇到问题。我有一个示例,我调用一项服务并将其用作对我的路线的响应

def test = Action.async { implicit request =>
    val baseUrl = "serviceURL"

    WS.url(baseUrl).get().map { response =>
      val result = response.json.asOpt[List[Person]]

      Ok(views.html.test(result.get))
    }
}

这工作正常,但现在我想调用 2 个 Web 服务,但我不能这样做来编写响应,因为 WS.url().get() 调用 return 一个 Future 并且我不知道如何从里面提取 Option 。所以问题是:

如何从 Future 中获取 Option

我试过这样做:

def test = Action.async { implicit request =>
    val baseUrl = "serviceURL"

    val wsResult = WS.url(baseUrl).get().map { response =>
      val result = response.json.asOpt[List[Person]]
    }

    Ok(views.html.test(wsResult.get))
}

但正如我所说,wsResult 有一个 Future 而不是 Option

的实例

我还没有使用过 PlayFramework,除了 Play-Json,如果你早点得到更明智的答案,我就不会回答了。但我认为你想要 return

wsResult.flatMap { Ok(views.html.test(_)) }

这构建了一个围绕 wsResult 中的结果的新未来。

您可以在第一个 webservice 的 map 块中调用第二个 webservice,并在第一个服务调用中将 map 更改为 flatMap。

val wsResult = WS.url(baseUrl).get().flatMap { response =>
      val result = response.json.asOpt[List[Person]]
     secondwebserice.map{ res=>

    Ok(views.html.test(result.get))
 }
}

既然你的问题,我想,这两个网络服务是独立的,所以你也可以使用 for comprehension as

val wsResult1 = WS.url(baseUrl).get().map { response =>
      val result = response.json.asOpt[List[Person]]
    }
val wsResult2 = WS.url(baseUrl2).get().map { response =>
      val result = response.json.asOpt[List[Person]]
    }

val result = for {
r1<-wsResult1 
r2<-wsResult2 
}yield(r1.get++r2.get)

result .map {res=>  Ok(views.html.test(res)) }