处理在Scala play框架中进行外部URL调用的正确方法

处理在Scala play框架中进行外部URL调用的正确方法,scala,playframework,Scala,Playframework,我是Scala新手,玩2.0,所以这可能是一个非常简单的问题。我有以下代码(为简洁起见,使用pseucode): } 这是处理外部URl调用结果的正确方法吗?我看到过一些帖子提到使用onComplete来处理未来,而不是使用Wait,因为它是阻塞的。正如@quirier所评论的,Play为这种情况提供了Action.async。有关文档的更多信息: 执行Await从来都不是一个好的解决方案(几乎?)您正在使用操作,因此您必须对任何返回Future[T]的方法调用使用Await.result。 每

我是Scala新手,玩2.0,所以这可能是一个非常简单的问题。我有以下代码(为简洁起见,使用pseucode):

}


这是处理外部URl调用结果的正确方法吗?我看到过一些帖子提到使用onComplete来处理未来,而不是使用Wait,因为它是阻塞的。

正如@quirier所评论的,Play为这种情况提供了
Action.async
。有关文档的更多信息:


执行
Await
从来都不是一个好的解决方案(几乎?)

您正在使用操作,因此您必须对任何返回Future[T]的方法调用使用Await.result。
每当使用返回将来[t]的方法时,考虑使用Acto.AsiNC,因为它允许您返回将来[结果]。 Action.async在播放2.2或2.3后可用

下面是使用Action.async的代码

def oauth = Action { request =>
  val paramMap = request.queryString.map { case (k, v) => k -> v.mkString }
  if (paramMap.contains("error")) {
    // Redirect to error page
  } else {
    val d2 = Duration(1000, "millis")
    val futureResponse = ws.url(someExternalUrl).withQueryString(...).toString).get()

    futureResponse.map(response => {
      val json = response.json
      val userId: String = (json \ "user_id").as[String]
      Redirect(routes.Application.home()).withSession(
        "user_id" -> userId
      )
    })
  }
}

Play 2.0太旧了,您应该将其更新到至少2.4,如果可能的话,可以使用2.5。

使用
操作。异步
而不是
操作
并删除
等待。结果
如何显示错误页面?我有这样的想法:
Ok(views.html.error..)
当我使用
Action.async
Future(Ok(views.html.error..)
时,它会给我语法错误。因为您操作的返回类型现在是
Future[Result]
def oauth = Action { request =>
  val paramMap = request.queryString.map { case (k, v) => k -> v.mkString }
  if (paramMap.contains("error")) {
    // Redirect to error page
  } else {
    val d2 = Duration(1000, "millis")
    val futureResponse = ws.url(someExternalUrl).withQueryString(...).toString).get()

    futureResponse.map(response => {
      val json = response.json
      val userId: String = (json \ "user_id").as[String]
      Redirect(routes.Application.home()).withSession(
        "user_id" -> userId
      )
    })
  }
}