2 つの値を生成する wai ミドルウェアがあります。
- リクエストごとにランダムに生成されるリクエスト ID
- リクエストから別のサービスへのユーザー。
コードは次のとおりです。
addRequestIdToRequestHeader' :: Application -> Application
addRequestIdToRequestHeader' app req respond = do
rid <- nextRequestId :: IO ByteString
user <- fetchUserByReq req :: IO User
req' <- attachUserAndRequestIdToRequest user rid
app req' respond
これでルートができましたGET /user
。このルート内で、リクエスト ID とユーザーにアクセスしたいと思います。例として、それらをログに出力するだけです。
main :: IO ()
main =
scotty 8080 $ do
get "/user" $ do
req <- request
rid <- liftAndCatchIO $ getRequestIdFromRequest req
user <- liftAndCatchIO $ getUserFromRequest req
liftAndCatchIO $ print rid
liftAndCatchIO $ print user
text $ username user
問題は、リクエスト ID とユーザーがミドルウェアから生成されるため、ルートからそれらにアクセスする方法です。基本的に、上記のコードで使用される次の関数を実装する方法:
attachUserAndRequestIdToRequest :: User -> ByteString -> Request -> IO Request
getRequestIdFromRequest :: Request -> IO ByteString
getUserFromRequest :: Request -> IO User
シナリオは、ミドルウェアが認証ミドルウェアであり、認証のためにリクエストを別のサービスに転送し、ルートで必要になるユーザー値を取得することです。