我目前从Network.Wai.Middleware.RequestLogger运行中间件logStdoutDev,但它只记录路径和Accept标头(也可能是其他标头)。我也希望看到POST和PUT请求的正文。这个正文恰好是json,所以只需将它打印到stdout即可。
我搜索了一个WAI中间件,它记录了所有内容,但没有找到任何内容。我真的不太了解WAI内部的东西来写一些提取POST体的东西,然后把它放回自己,所以我希望现在避免这种学习曲线。
答案 0 :(得分:4)
WAI Middleware
只是对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。这可能不完全正确。
答案 1 :(得分:0)
此功能是从outputs('Compose')[1]['key4']
包中提供的。
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"