如何在Yesod的monad中重定向?

时间:2012-06-08 10:37:19

标签: facebook haskell redirect monads yesod

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

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

1 个答案:

答案 0 :(得分:3)

看起来如果您通过经理/ Facebook monad的那些层传递重定向网址,那么您可以只提供它。重定向的网址类型为Text,其实例为RedirectUrl类型,是使用redirect功能所必需的(如documentation所示)。

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跑步者,将输入:

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

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

使用这对withrun模式,我们得到的结果是,内部深处提供的URL会冒泡到我们的Handler monad中。然后我们就把它抓出来并将它交给redirect函数!