我目前从 Network.Wai.Middleware.RequestLogger 运行中间件 logStdoutDev,但它只记录路径和 Accept 标头(也可能是其他标头)。我也想查看 POST 和 PUT 请求的正文。这个主体恰好是 json,所以只需将其打印到标准输出就可以了。
我已经搜索了一个 WAI 中间件,它记录了所有内容但没有找到任何内容。我对 WAI 内部的了解还不够,无法编写一些提取 POST 正文然后将其放回自己的东西,所以我希望现在能避免这种学习曲线。
我目前从 Network.Wai.Middleware.RequestLogger 运行中间件 logStdoutDev,但它只记录路径和 Accept 标头(也可能是其他标头)。我也想查看 POST 和 PUT 请求的正文。这个主体恰好是 json,所以只需将其打印到标准输出就可以了。
我已经搜索了一个 WAI 中间件,它记录了所有内容但没有找到任何内容。我对 WAI 内部的了解还不够,无法编写一些提取 POST 正文然后将其放回自己的东西,所以我希望现在能避免这种学习曲线。
WAIMiddleware
只是一个转换Application
:
type Middleware = Application -> 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