gpt4 book ai didi

haskell - 将 http-conduit 连接到 xml-conduit

转载 作者:行者123 更新时间:2023-12-05 00:35:38 25 4
gpt4 key购买 nike

我正在努力通过 xml-conduit 将响应从 http-conduit 转换为 XML 文档。
doPost函数接受一个 XML 文档并将其发布到服务器。服务器使用 XML 文档进行响应。

doPost queryDoc = do
runResourceT $ do

manager <- liftIO $ newManager def
req <- liftIO $ parseUrl hostname

let req2 = req
{ method = H.methodPost
, requestHeaders = [(CI.mk $ fromString "Content-Type", fromString "text/xml" :: Ascii) :: Header]
, redirectCount = 0
, checkStatus = \_ _ -> Nothing
, requestBody = RequestBodyLBS $ (renderLBS def queryDoc)
}

res <- http req2 manager
return $ res

以下工作并返回“200”:
let pingdoc = Document (Prologue [] Nothing []) (Element "SYSTEM" [] []) []
Response status headers body <- doPost pingdoc
return (H.statusCode status)

但是,当我尝试使用 xml-conduit 解析响应正文时,我遇到了问题:
Response status headers body <- doPost xmldoc
let xmlRes' = parseLBS def body

产生的编译错误是:
Couldn't match expected type `L.ByteString'
with actual type `Source m0 ByteString'
In the second argument of `parseLBS', namely `body'
In the expression: parseLBS def body
In an equation for `xmlRes'': xmlRes' = parseLBS def body

我尝试使用 $= 和 $$ 将源从 http-conduit 连接到 xml-conduit,但没有任何成功。

有没有人有任何提示可以指出我正确的方向?提前致谢。

尼尔

最佳答案

您可以使用 httpLbs而不是 http ,因此它返回一个惰性 ByteString而不是 SourceparseLBS函数被命名是因为它需要:一个惰性字节字符串。但是,正如您所提到的,最好使用两者直接基于的管道接口(interface)。为此,您应该删除 runResourceT来自 doPost 的行,并使用以下内容获取 XML 文档:

xmlRes' <- runResourceT $ do
Response status headers body <- doPost xmldoc
body $$ sinkDoc def

这使用 xml-conduit 的 sinkDoc 函数,连接 Source从 http-conduit 到 Sink来自 xml 管道。

连接后,必须使用 runResourceT 运行完整的管道。 ,确保及时释放所有分配的资源。您的原始代码的问题在于它运行 ResourceT太早了,从内部 doPost ;您通常应该使用 runResourceT就在您想要得到实际结果的时候,因为管道必须完全在单个 ResourceT 的范围内运行.

顺便说一句, res <- http req2 manager; return $ res可以简化为 http req2 manager .

关于haskell - 将 http-conduit 连接到 xml-conduit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9245342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com