使用播放2.3 在动作中合并网络服务时,我遇到了一些困境。在这个“ping”操作中,我首先检查请求者是否有会话令牌。如果是,则应用程序将字符串“pong”返回给浏览器。
def ping = Action { request =>
request.session.get("token") match {
case Some(token) => {
Ok("pong")
} case None => Unauthorized("error")
}
}
现在,如果我在这样的操作中添加对另一个Web服务的调用:
def ping = Action.async { request =>
request.session.get("email") match {
case Some(email) => {
WS.url("http://localhost:8080/ping").get.map { response =>
Ok(response.json.as[JsString].value)
}
} case None => Unauthorized("error")
}
}
我最终导致不匹配,无匹配的匹配器(没有会话令牌的人)不在Future中。
type mismatch; found : play.api.mvc.Result required: scala.concurrent.Future[play.api.mvc.Result]
我现在唯一的选择是摆脱交换机中的无。编译器警告我,这个逻辑容易出错......但它会编译。我假设我在这里做错了,无论是异步ws调用还是会话变量处理。
任何人都可以建议我如何修复此ping操作,以便它可以处理会话变量和异步的切换。我刚刚开始掌握Scala Concurrency / Futures。
答案 0 :(得分:4)
Action.async
需要Future[Result]
,但Unauthorized("error")
只是Result
。您可以通过简单地使其成功Future
来解决此问题。
def ping = Action.async { request =>
request.session.get("email") match {
case Some(email) => {
WS.url("http://localhost:8080/ping").get.map { response =>
Ok(response.json.as[JsString].value)
}
}
case None => Future.successful(Unauthorized("error"))
}
}
答案 1 :(得分:1)
将case None
替换为:
// ...
case None => Future.successful(Unauthorized("error"))
因此,在两种情况下,类型都将是结果的未来(成功返回HTTP错误)。