我想使用内置的playframework缓存API,但不确定如何在期货时缓存此Web服务请求。
def getUser(username: String): Future[Option[User]] = {
ws.url("...").get.map { response =>
response.json.validate[User] match {
case JsSuccess(user, _) => Some(user)
case JsError(errors) => {
// log errors
None
}
}
}
}
缓存密钥只是现在的用户名。
我如何在这里使用缓存API?
我想使用getOrElse模式:
val user: User = cache.getOrElse[User]("item.key") {
User.findById(connectedUser)
}
但是Future和Option让我对如何使用它感到困惑。
答案 0 :(得分:1)
我会这样做:
def fromWebservice(username: String): Future[Option[User]] =
ws.url("..").get.map(validate) // validate does the json validate thing
def getUser(username: String): Future[Option[User]] =
cache.getAs[User](username) match {
case Some(x) =>
Future.successful(Some(x))
case None =>
fromWebservice(username).map(_.map { user =>
cache.set(username, user)
x
})
}
另外,Play缓存API没有返回Future
的API,但他们正在处理它:https://github.com/playframework/playframework/issues/5912