私はplay2.0-Scalaの初心者であり、HTMLページを生成するためにいくつかのWebサービスを呼び出す必要があります。
Play WSAPIページとSadekDrobiからの非常に興味深い記事を読んだ後、これを達成するための最良の方法がまだわかりません。
この記事には、Playの初心者としては完全には理解していないコードスニペットがいくつか示されています。
4ページの図2
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呼び出しを1つの式で組み合わせる方法を示していますfor
。
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の後のextra-に少し混乱してい}
ます。)このようなものを書く必要がありますか?
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ノンブロッキング呼び出しの構成)?(例:呼び出されたWebサービスのいずれかがエラー404を生成した場合、エラー404ステータスコードを生成したい)。
たぶん誰かがPlayFrameworkでWebサービスを呼び出す完全な例を知っています(Playサンプルアプリケーションや他の場所で例を見つけることができません)。