gpt4 book ai didi

scala - 玩!框架使用异步 Web 请求组合操作

转载 作者:行者123 更新时间:2023-12-02 17:41:24 24 4
gpt4 key购买 nike

我对 Scala 很陌生我正在尝试从 Play 访问 Instagram API!和斯卡拉。

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,这不是您想要的。相反,您希望映射您从 WS 调用返回的 future ,并返回该 future 。要在 Play 中返回 future ,您需要使用 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))
}
}

关于scala - 玩!框架使用异步 Web 请求组合操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20252970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com