我是一個play2.0-Scala初學者,必須調用多個Web服務才能生成HTML頁面。從播放2調用多個網絡服務
閱讀The Play WS API頁面後和非常有趣article from Sadek Drobi我仍然不確定什麼是做到這一點的最好辦法。
該文章顯示了一些代碼片段,我並不完全理解爲Play初學者。
圖2第4頁:
val response: Either[Response,Response] =
WS.url("http://someservice.com/post/123/comments").focusOnOk
val responseOrUndesired: Either[Result,Response] = response.left.map {
case Status(4,0,4) => NotFound
case Status(4,0,3) => NotAuthorized
case _ => InternalServerError
}
val comments: Either[Result,List[Comment]] =
responseOrUndesired.right.map(r => r.json.as[List[Comment]])
// in the controller
comment.fold(identity, cs => Ok(html.showComments(cs)))
什麼用fold
最後一行呢?應該comment
是comments
?我沒有把Async
區塊中的最後一條語句分組嗎?
圖4顯示了怎麼把幾個IO調用帶有一個for
-expression:
for {
profile <- profilePromise
events <- attachedEventsPromise
articles <- topArticlesPromise
} yield Json.obj(
"profile" -> profile,
"events" -> events,
"articles" -> articles)
}
// in the controller
def showInfo(...) = Action { rq =>
Async {
actorInfo(...).map(info => Ok(info))
}
}
如何使用這個片段? (在for-expression之後,我有點困惑於額外的}
)。 我應該寫這樣的東西嗎?
var actorInfo = for { // Model
profile <- profilePromise
events <- attachedEventsPromise
articles <- topArticlesPromise
} yield Json.obj(
"profile" -> profile,
"events" -> events,
"articles" -> articles)
def showInfo = Action { rq => // Controller
Async {
actorInfo.map(info => Ok(info))
}
}
結合圖2和圖4中的片段(錯誤處理+ IO無阻塞調用的組成)的最佳方式是什麼? (f.ex.如果任何被調用的webservice產生錯誤404,我想產生一個錯誤404狀態碼)。
也許有人知道在播放框架中調用web服務的完整示例(在播放示例應用程序或其他任何地方找不到示例)。
感謝您的回答,它現在更清晰:-)。但是,如何在f.ex中生成錯誤頁面。在''getInfo()''中調用產生一個錯誤500? – Sonson123
在這種情況下,您可以在getInfo中返回一個'Option',如果出現錯誤則返回'None',否則返回包含實際值的'Some'(如果不是錯誤)。然後,您可以在控制器中進行模式匹配,並返回一個InternalServerError,如果它是'None'或Ok否 – thatsmydoing
好的,非常感謝您的詳細解答!我想要兩個不同的錯誤代碼(404,500),所以我會嘗試返回'Either'並在'getInfo'中使用'response.status',並希望這可以工作... – Sonson123