1

我正在使用 scotty,它是 WAI 的一个类似 sinatra 的包装器。我想将原始请求正文作为字节字符串获取,以便可以将其解析为 json。以下是接近的。这类似于其他关于使用 WAI 使用 body 的问题,但不同的是因为我希望 body 作为字节串,并且因为我在不同的 monad 中,ActionM

import Network.Wai (requestBody)
import Web.Scotty (ActionM, request, text)

bodyExample :: ActionM ()
bodyExample = do
    r <- request
    bss <- requestBody r -- this needs a lift or something
    text "ok"
    ...

这显然行不通,我想我需要某种升降机之类的东西,但我不知道该用什么。liftIO是不对的,并且lift给了我奇怪的错误。

http://hackage.haskell.org/packages/archive/scotty/0.0.1/doc/html/Web-Scotty.html

http://hackage.haskell.org/packages/archive/wai/latest/doc/html/Network-Wai.html

4

4 回答 4

4

值得一提的是,新版本的 Scotty (0.2.0) 有一个 'jsonData' 方法可以为您执行此操作。感谢您使用!

于 2012-02-04T23:17:30.923 回答
2

由于工作方式,接受的答案实际上不会lazyConsume起作用。它总是会返回一个空列表。如果您使用是.ResourceTlazyConsume

作为替代方案,以下是严格使用字节串并返回它的方法:

rawRequestBody :: Request -> IO B.ByteString
rawRequestBody req = mconcat <$> runResourceT (requestBody req $$ consume)
于 2012-12-27T07:45:53.107 回答
1

requestBody不是一元值。它只是一个返回 Conduit 的函数Source IO ByteString

要使用源,请使用Data.Conduit.List.consume(或Data.Conduit.Lazy.lazyConsume)。您将得到一个ByteStrings 列表作为结果。然后退出ResourceTmonad 转换器,使用runResourceT. 结果代码:

bss <- liftIO . runResourceT . lazyConsume . requestBody $ r
bss :: [ByteString]
于 2012-01-28T03:12:55.690 回答
0

这是最终为我工作的代码,改编自 jhickner 的

rawRequestBody req = mconcat <$> (requestBody req $$ consume)
于 2014-04-21T20:29:37.340 回答