【问题标题】:yesod - getting the request body for a POST "Content-type: application/json"yesod - 获取 POST "Content-type: application/json" 的请求正文
【发布时间】:2011-08-11 16:54:37
【问题描述】:

使用 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

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

【问题讨论】:

    标签: haskell yesod


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 请注意,您也可以使用requireJsonBody :: Handler Value,然后如果您不想为Foo 编写新的数据类型,只需使用 Lens 提取您需要的字段。
    【解决方案2】:

    Here's how to do it now。对于未来的版本,我希望添加一些方便的包装器;对此表示赞赏。

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

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

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

    【讨论】:

    • 谢谢,这是有道理的。同时学习 Haskell 和 Yesod,所以这个回复很有帮助。
    • 那个助手已经可用了吗?如果不是,它会是什么样子(尤其是 JSON 解析部分)?我设法获取惰性字节串,但难以将其解析为一些 JSON。
    • @DaxFohl hackage.haskell.org/packages/archive/yesod-json/1.0.0.1/doc/… 让它变得非常简单,并且适用于 FromJSON 的任何实例。
    【解决方案3】:

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

    postRootR = do
        wr <- waiRequest
        bss <- lift $ lazyConsume $ requestBody wr
        let requestBody = L.fromChunks bss
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 2020-11-14
      • 2013-04-15
      • 2022-11-11
      • 1970-01-01
      • 2012-01-30
      相关资源
      最近更新 更多