我是 play2.0-Scala 初学者,必须调用多个 Web 服务来生成 HTML 页面。
在阅读了The Play WS API页面和来自 Sadek Drobi的一篇非常有趣的文章之后,我仍然不确定实现此目的的最佳方法是什么。
这篇文章展示了一些我作为 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 调用与单个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 表达式之后的额外 - 有点困惑。)我应该写这样的东西吗?
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 状态代码)。
也许有人知道在 play framework 中调用 webservices 的完整示例(在 play Sample applications 或其他任何地方都找不到示例)。