0

我目前正在使用fb包编写一个从 Facebook 获取数据的 Yesod 应用程序。在我的处理程序中,我设法使身份验证的第一步工作,但我需要重定向到getUserAccessTokenStep1返回的 url,我将其定义为fbRedirUrl. 我在所有 monad 包装和类型检查方面都遇到了问题,以确保我可以重定向到这个 url。

getAccessTokenR :: Handler RepHtml
getAccessTokenR = do
  withManager $ \manager -> do
    FB.runFacebookT creds manager $ do
      fbRedirUrl <- FB.getUserAccessTokenStep1 redirUrl []
      liftIO $ print fbRedirUrl
4

1 回答 1

3

看起来如果您通过这些管理器/Facebook monad 层将重定向 URL 传回,那么您就可以提供它。重定向 URL 的类型是Text,它有一个RedirectUrltypeclass 的实例,这是使用该redirect函数所必需的(如文档中所示)。

应该能够通过以下方式完成这项工作:

getAccessTokenR :: Handler RepHtml
getAccessTokenR = do
  url <- withManager $ \manager ->
    FB.runFacebookT creds manager $
       FB.getUserAccessTokenStep1 redirUrl []
  redirect url

这里没有真正的魔法,你基本上有两种高级模式,一种是“with”模式,它将本地化​​资源的使用(在本例中为manager),另一种是“运行”模式,那是真的使用 Monad 变换器(不要太担心细节!)。

所以withManager给你一个经理来使用,大概它会处理一些经理的设置和删除。这可能是这样的

withManager :: (Manager -> Handler a) -> Handler a

在其中你有 facebook runner,它将被键入:

runFacebookT :: Credentials -> Manager -> FacebookT Auth Handler a -> Handler a

这基本上是说,如果你给它一些凭据、管理器和一些 Facebook 特定的计算(比如获取重定向 URL),它可以将其转换为你选择的 Monad(这里我们选择Handler,因为这就是withManager想要的)。在您的情况下,a类型变量是Text重定向 URL 的。

使用这对withrun模式,我们得到的结果是,在深处提供的 URL 会冒泡到我们的Handlermonad 中。然后我们把它找出来并把它交给redirect函数!

于 2012-06-08T11:52:01.543 回答