Haskell 如何在WAI/scotty中记录整个HTTP请求?

Haskell 如何在WAI/scotty中记录整个HTTP请求?,haskell,Haskell,我目前从Network.Wai.middleware.RequestLogger运行中间件logStdoutDev,但它只记录路径和Accept头(可能还有其他头)。我想看看帖子的主体,并把请求也放进去。这个主体恰好是json,所以只需将其打印到stdout即可 我搜索了一个WAI中间件,它记录了所有内容,但没有找到任何内容。我对WAI的内部结构了解不够,无法编写一些东西来提取文章正文,然后将其放回我自己,所以我现在希望避免这种学习曲线。WAI中间件只是对应用程序的一种转换: type Midd

我目前从Network.Wai.middleware.RequestLogger运行中间件logStdoutDev,但它只记录路径和Accept头(可能还有其他头)。我想看看帖子的主体,并把请求也放进去。这个主体恰好是json,所以只需将其打印到stdout即可


我搜索了一个WAI中间件,它记录了所有内容,但没有找到任何内容。我对WAI的内部结构了解不够,无法编写一些东西来提取文章正文,然后将其放回我自己,所以我现在希望避免这种学习曲线。

WAI
中间件
只是对
应用程序的一种转换:

type Middleware = Application -> Application
应用程序
只是一个处理程序:

type Application = Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived
您需要做的就是定义一个处理程序,它将记录您想要的任何内容,并将“真正的工作”委托给下游:

-- note that this is equivalent to Application -> Application
logAllMiddleware :: Application -> Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived
logAllMiddleware app req respond = do
    print . unpack . requestBody req
    app req respond

请记住,我写这段代码时没有访问ghc。它可能不完全正确。

此功能由
wai extra
软件包提供

{-# LANGUAGE OverloadedStrings #-}

import Web.Scotty
import Network.HTTP.Types
import Network.Wai.Middleware.RequestLogger

main = scotty 3000 $ do
  middleware logStdoutDev
  get "/" $ do
    text "example"
示例输出:

Setting phasers to stun... (port 3000) (ctrl-c to quit)
GET /
  Accept: */*
  Status: 200 OK 0.000050947s
我目前只在每个路由处理程序中使用“body>=liftIO.putStrLn.show”,但这显然不是干巴巴的。我想早点做。