0

現在、fbパッケージを使用して、Facebook からデータを取得する Yesod アプリを作成しています。私のハンドラーでは、認証の最初のステップを機能させることができましたが、getUserAccessTokenStep1返される URL にリダイレクトする必要がありますfbRedirUrl。この 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

リダイレクトURLをマネージャー/Facebookモナドのこれらのレイヤーを介して戻すと、フィードすることができるように見えます。リダイレクトされたURLのタイプはです。これにはtypeclassTextのインスタンスがあり、関数を使用するために必要です(ドキュメントを参照)。RedirectUrlredirect

次のような方法でこの作業を行うことができるはずです。

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

ここには本当の魔法はありません。基本的に2つの高レベルのパターンが進行中です。1つはリソースの使用状況(この場合はmanager)をローカライズする「with」パターンで、もう1つは「run」パターンです。モナド変換子の使用(詳細についてはまだあまり気にしないでください!)。

したがってwithManager、使用するマネージャーを提供します。おそらく、マネージャーのセットアップと削除を処理します。これはおそらく次のように入力されます

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

その中にFacebookランナーがあり、次のように入力されます。

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

これは基本的に、クレデンシャル、マネージャー、およびFacebook固有の計算(リダイレクトURLの取得など)を与えると、それを選択したモナドに変換できることを意味します(ここでは、それが必要Handlerなため、選択しますwithManager)。あなたの場合、a型変数はTextリダイレクトURLのものです。

このパターンのペアを使用するwithと、その奥深くで提供されたURLがモナドrunにバブルアップするという結果が得られます。Handler次に、それを引っ掛けてredirect関数に渡します。

于 2012-06-08T11:52:01.543 に答える