我正在尝试使用 wai 编写一个非常微不足道的“回声”网络应用程序;我想要它做的就是回复发布给它的数据(我真的不关心该方法,但我正在使用 curl 并且 curl 正在使用 POST,所以这就是我想要的)。我的微不足道的网络服务器是这样的:
import Network.Wai
import Network.HTTP.Types (status200)
import Network.Wai.Handler.Warp (run)
import Control.Monad.Trans ( liftIO )
import Blaze.ByteString.Builder.ByteString (fromByteString)
import qualified Data.Conduit.List as CondList
import Data.Conduit ( ($$), ($=), Flush(Chunk) )
application req = do
let src = requestBody req $= CondList.map (Chunk ∘ fromByteString)
return $ ResponseSource status200 [("Content-Type", "text/plain")] src
main = run 3000 application
我期望这样做基本上是将请求正文与响应正文联系起来,这样当我运行curl --data @/usr/share/dict/words localhost:3000
; 它会向我吐出我的话。相反,它给出了一个空的身体。使用“-v”运行 curl 表明我的应用正在回复“200 OK”并且没有数据。我不确定我在这里做错了什么。
如果我用这个替换应用程序功能:
_ ← requestBody req $$ CondList.mapM_ (liftIO ∘ print)
return $ responseLBS status200 [("Content-Type", "text/plain")] "Hello world\n"
并添加一个 OverloadedStrings 杂注以允许“Hello World”部分工作,然后我确实看到我的应用程序将整个请求正文打印到标准输出,所以我知道 curl 正在正确提交数据。我还将“Hello World”打印到 curl 标准输出,所以我知道 curl 按我的预期工作。在将 requestBody 绑定到 ResponseSource 的地方,我一定做错了,但我没有看到。