4

http-conduitからxml-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にソースを接続しようとしましたが、成功しません。

誰かが私を正しい方向に向けるためのヒントがありますか?前もって感謝します。

ニール

4

1 に答える 1

6

httpLbsではなくを使用して、aではなくhttpレイジーを返すようにすることができます—関数は、それが必要なものであるため、名前が付けられていますL azy B yteString 。ただし、前述のように、2つが直接基づいているコンジットインターフェイスを使用するのがおそらく最善です。これを行うには、から行を削除し、以下を使用してXMLドキュメントを取得する必要があります。ByteStringSourceparseLBSrunResourceTdoPost

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

これはxml-conduitのsinkDoc関数を使用して、fromhttp-conduitをfromxml-conduitに接続しSourceますSink

それらが接続されたら、を使用して完全なパイプラインを実行する必要がrunResourceTあります。これにより、割り当てられたすべてのリソースがタイムリーに解放されます。元のコードの問題は、ResourceT内部から実行するのが早すぎることdoPostです。パイプラインは完全に単一のスコープ内で実行する必要があるため、通常はrunResourceT実際の結果が必要な時点で使用する必要がありますResourceT

ちなみに、res <- http req2 manager; return $ res単純化してhttp req2 manager

于 2012-02-12T00:35:29.173 に答える