【问题标题】:Correct way to handle make an external URL call in Scala play framework在 Scala 播放框架中处理外部 URL 调用的正确方法
【发布时间】:2017-01-12 17:28:56
【问题描述】:

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

var someExternalUrl = ...
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()

      var m = futureResponse.map(response => {
        val json = response.json

        val userId: String = (json \ "user_id").as[String]
        Redirect(routes.Application.home()).withSession(
        "user_id" -> userId
        )
      })
      Await.result(m, d2)
    }

}

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

【问题讨论】:

  • 使用Action.async 代替Action 并删除Await.result
  • 如何显示错误页面?我有这样的东西:Ok(views.html.error..),当我使用Action.async时它给了我语法错误@
  • Future(Ok(views.html.error..)) 使用这个。因为您的操作的返回类型现在是 Future[Result]

标签: scala playframework


【解决方案1】:

正如@curious 所评论的,Play 为此类情况提供了Action.async。有关文档的更多信息:https://www.playframework.com/documentation/2.5.x/ScalaAsync#Returning-futures

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

【讨论】:

    【解决方案2】:

    您正在使用 Action,因此您必须对任何返回 Future[T] 的方法调用使用 Await.result。
    每当您使用返回 Future[T] 的方法时,请考虑使用 Action.async,因为它允许您返回 Future[Result]。 Action.async 从 play 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      相关资源
      最近更新 更多