在 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)) }
我在 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)) }