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