14

使用 yesod 0.8.0,我正在尝试从此示例请求中检索帖子消息的正文:

curl -v -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{"name":"oscar"}'    http://localhost:3000/user/xyz

在我的处理程序中,我看到它的唯一方法是使用

(pp, files) <- runRequestBody

但这因内容类型而失败。是否有其他功能可以做到这一点?

4

3 回答 3

17

其他答案似乎很旧,并且在添加下面使用的功能之前。

postFooR :: Handler Value
postFooR = do
 foo <- requireJsonBody :: Handler Foo -- get the json body as Foo (assumes FromJSON instance)
 returnJson foo -- return json (assumes ToJSON instance)
于 2015-08-11T02:30:39.847 回答
8

这是现在的方法。对于未来的版本,我希望添加一些方便的包装器;对此的意见表示赞赏。

解释:每个处理函数都存在于一个GGHandler sub master (Iteratee ByteString IO)monad 中。这相当复杂,但这意味着它是一个围绕接收字节字符串流的 Iteratee 的 Handler monad 转换器。该 ByteStrings 流是原始请求正文。

所以我们需要使用枚举器的消费函数来获取整个字节串流并将它们存储为一个列表。我们需要使用 lift 函数将其提升到内部 monad(Iteratee)。L.fromChunks 然后从严格的 ByteString 列表转换为惰性 ByteString,您可以使用任意 JSON 库对其进行解析(Yesod 正在对 aeson 进行标准化)。

我的猜测是我能提供的最方便的功能是parseRequestJson :: GGHandler s m (Iteratee ByteString IO) (Maybe Data.Aeson.Value). 我可以在 yesod-json 的单点版本中添加它。

于 2011-04-24T03:52:24.643 回答
3

在 Yesod 1.0+(可能更早,不确定)中,以下似乎有效:

postRootR = do
    wr <- waiRequest
    bss <- lift $ lazyConsume $ requestBody wr
    let requestBody = L.fromChunks bss
于 2012-04-15T20:32:47.207 回答