2015-04-01 24 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的結果。