Я новичок в play2.0-Scala, и мне нужно вызвать несколько веб-сервисов для создания HTML-страницы.
Прочитав страницу Play WS API и очень интересная статья Садека Дроби Я до сих пор не знаю, как лучше всего это сделать .
В статье показаны некоторые фрагменты кода, которые я не совсем понимаю как новичок в 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 показано, как объединить несколько вызовов ввода-вывода с одним 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 (обработка ошибок + композиция неблокирующих вызовов ввода-вывода)? (например, я хочу создать код состояния ошибки 404, если какой-либо из вызываемых веб-сервисов выдает ошибку 404).
Может быть, кто-то знает полный пример вызова веб-сервисов в play framework (не могу найти пример в приложениях play Sample или где-либо еще).