2016-11-28 88 views
4

兩個資源我發現,使用流行的哈斯克爾庫流下載推薦的食譜是:哈斯克爾流媒體下載

我將如何修改代碼前,以(a)保存到文件,(b)只打印一個(取5)字節響應,而不是整個響應到stdout?

我在(b)嘗試是:

#!/usr/bin/env stack 
{- stack --install-ghc --resolver lts-5.13 runghc 
    --package http-conduit 
-} 
{-# LANGUAGE OverloadedStrings #-} 
import   Control.Monad.IO.Class (liftIO) 
import qualified Data.ByteString  as S 
import qualified Data.Conduit.List  as CL 
import   Network.HTTP.Simple 
import   System.IO    (stdout) 

main :: IO() 
main = httpSink "http://httpbin.org/get" $ \response -> do 
    liftIO $ putStrLn 
      $ "The status code was: " 
      ++ show (getResponseStatusCode response) 

    CL.mapM_ (take 5) (S.hPut stdout) 

從而未能映射(坐5),以及除其他事項外建議給我,我還是不明白,在單子的映射是如何工作的,或liftIO 。

而且,這種資源:

http://haskelliseasy.readthedocs.io/en/latest/#note-on-streaming

...給了我一個警告,「我知道我在做什麼,我想對資源,如流更細粒度的控制「這不容易或普遍支持。

其它地方我看了看:

如果有在使這更容易的Haskellverse東西,更喜歡Python的請求:

response = requests.get(URL, stream=True) 
for i,chunk in enumerate(response.iter_content(BLOCK)): 
    f.write(chunk) 

我也很欣賞那裏的提示,或指向2016年的藝術狀態。

+1

您是否確實需要流式傳輸? (那麼你是否一次獲得足夠多的數據,使其全部在內存中是不可接受的?) – Alec

+0

是的,我是。 – Mittenchops

+0

我可能應該選擇一個更合理的字節數,如一些2^n ... – Mittenchops

回答

3

您可能正在尋找http-conduit的最新版本httpSource。它的行爲與Python的請求幾乎完全相同:你得到一串塊。

保存到文件

這很容易,只要重定向源直入一個文件接收器。

#!/usr/bin/env stack 
{- stack --install-ghc --resolver nightly-2016-11-26 runghc --package http-conduit -} 

{-# LANGUAGE OverloadedStrings #-} 
import Network.HTTP.Simple (httpSource, getResponseBody) 
import Conduit 

main = runConduitRes $ httpSource "http://httpbin.org/get" getResponseBody 
        .| sinkFile "data_file" 

打印僅一個(坐5)字節響應

的一旦我們有了源,我們取第一個5個字節與takeCE 5,然後經由printC打印這些。

#!/usr/bin/env stack 
{- stack --install-ghc --resolver nightly-2016-11-26 runghc --package http-conduit -} 

{-# LANGUAGE OverloadedStrings #-} 
import Network.HTTP.Simple (httpSource, getResponseBody) 
import Data.ByteString (unpack) 
import Conduit 

main = runConduitRes $ httpSource "http://httpbin.org/get" getResponseBody 
        .| takeCE 5 
        .| printC 

保存到文件只打印(坐5)字節響應

要做到這一點,你要zipSinks或者,對於涉及荏苒多個匯更一般的情況下, ZipSink

#!/usr/bin/env stack 
{- stack --install-ghc --resolver nightly-2016-11-26 runghc --package http-conduit -} 

{-# LANGUAGE OverloadedStrings #-} 
import Network.HTTP.Simple (httpSource, getResponseBody) 
import Data.ByteString (unpack) 
import Data.Conduit.Internal (zipSinks) 
import Conduit 

main = runConduitRes $ httpSource "http://httpbin.org/get" getResponseBody 
        .| zipSinks (takeCE 5 .| printC) 
           (sinkFile "data_file") 
+1

其實,takeCE將採取完全給流的元素,又稱五個字節。 –

+0

對不起,仍然在學習管道和這種思維方式:對於這種方式來說,對於這種方式來說,什麼樣的修改/流式處理/ takeC5輸出到stdout並且還會歸檔? – Mittenchops

+1

@MichaelSnoyman Nifty。愛你的圖書館! – Alec