2015-04-01 61 views
1

我在Playframework上调用Webservice时遇到问题。我在那里我调用一个服务,并把它作为回应我的路线在Playframework上调用2个REST服务来组成响应

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

这工作得很好的例子,但现在我想调用Web服务2,但我不能这样做,撰写因为响应WS.url().get()调用返回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

回答

1

您可以在第一个服务调用中调用第一个webservice的地图块内的第二个webservice,并将地图更改为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)) 
} 
} 

因为你的问题,我想,这两个Web服务是独立的,所以你也可以使用理解力

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)) } 
0

我没有用PlayFramework但除了播放JSON,又不会如果你早点得到了更明智的答案,他们已经回答了。但我认为你想要返回

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

这构建了一个新的未来,包裹着wsResult的结果。