我目前正在使用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
答案 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
。
使用这对with
和run
模式,我们得到的结果是,内部深处提供的URL会冒泡到我们的Handler
monad中。然后我们就把它抓出来并将它交给redirect
函数!