在另一个函数中播放Framework Action.async WS

时间:2014-08-22 23:45:16

标签: web-services scala asynchronous playframework-2.0

使用播放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。

2 个答案:

答案 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错误)。