繁体   English   中英

玩! 具有异步Web请求的框架组合动作

[英]Play! Framework composing actions with async web request

我对Scala还是很陌生,我正在尝试从Play访问Instagram API! 和Scala。

def authenticate = Action {
request =>
  request.getQueryString("code").map {
    code =>
      WS.url("https://api.instagram.com/oauth/access_token")
        .post(
        Map("client_id" -> Seq(KEY.key), "client_secret" -> Seq(KEY.secret), "grant_type" -> Seq("authorization_code"),
          "redirect_uri" -> Seq("http://dev.my.playapp:9000/auth/instagram"), "code" -> Seq(code))
      ) onComplete {
        case Success(result) => Redirect(controllers.routes.Application.instaline).withSession("token" -> (result.json \ "access_token").as[String])
        case Failure(e) => throw e
      }
  }
 Redirect(controllers.routes.Application.index)

}

应用执行时,在成功的情况下,最后一次重定向发生在重定向之前。 请告诉我,如何避免这种情况。 并且,请让我知道我代码中的不良做法。

使用Play,您可以返回结果-您不会发送结果。 onComplete方法附加了一个可以执行某些操作但不返回任何内容的方法(请注意,其返回值为Unit ,即void )。 附加该回调后,您Redirect在最后一行返回Redirect ,这不是您想要执行的操作。 相反,您想要map从WS调用获得的将来,并返回该将来。 要在Play中返回未来,您需要使用Action.async构建器。 例如:

def authenticate = Action.async { request =>

  request.getQueryString("code").map { code =>

    WS.url("https://api.instagram.com/oauth/access_token").post(
      Map(
        "client_id" -> Seq(KEY.key),
        "client_secret" -> Seq(KEY.secret),
        "grant_type" -> Seq("authorization_code"),
        "redirect_uri" -> Seq("http://dev.my.playapp:9000/auth/instagram"),
        "code" -> Seq(code)
      )
    ).map { result =>

      Redirect(controllers.routes.Application.instaline)
        .withSession("token" -> (result.json \ "access_token").as[String])

    }
  }.getOrElse {
    Future.successful(Redirect(controllers.routes.Application.index))
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM