12

我目前从 Network.Wai.Middleware.RequestLogger 运行中间件 logStdoutDev,但它只记录路径和 Accept 标头(也可能是其他标头)。我也想查看 POST 和 PUT 请求的正文。这个主体恰好是 json,所以只需将其打印到标准输出就可以了。

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

4

2 回答 2

4

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 的情况下编写了此代码。它可能并不完全正确。

于 2015-01-14T15:49:01.803 回答
4

此功能由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
于 2019-12-10T10:59:13.687 回答