我正在编写将通过 HTTP 下载一些文件的应用程序。在某种程度上,我使用以下代码片段来下载页面正文:
import network.HTTP
simpleHTTP (getRequest "http://www.haskell.org/") >>= getResponseBody
它工作正常,但无法通过 HTTPS 协议建立连接。因此,为了解决这个问题,我已切换到 HTTP-Conduit,现在我使用以下代码:
simpleHttp' :: Manager -> String -> IO (C.Response LBS.ByteString)
simpleHttp' manager url = do
request <- parseUrl url
runResourceT $ httpLbs request manager
它可以连接到 HTTPS,但出现了新的令人沮丧的问题。大约有五分之一的连接失败,但有异常:
getpics.hs: FailedConnectionException "i.imgur.com" 80
我确信这是 HTTP-Conduit 问题,因为 network.HTTP 在同一组页面(不包括 https 页面)上工作正常。
有没有人遇到过这样的问题并知道解决方案或更好的(而且简单,因为这是简单的任务,不应该超过几行代码)替代 Conduit 库?
一种简单的替代方法是使用curl http://hackage.haskell.org/package/curl包裹。它支持 HTTP、HTTPS 和许多其他替代协议,以及很多选择 http://hackage.haskell.org/package/curl-1.3.8/docs/Network-Curl-Opts.html#t%3aCurlOption自定义其行为。价格引入了外部依赖性libcurl http://curl.haxx.se/libcurl/,构建包所需的。
Example:
import Network.Curl
main :: IO ()
main = do
let addr = "https://google.com/"
-- Explicit type annotation is required for calls to curlGetresponse_.
-- Use ByteString instead of String for higher performance:
r <- curlGetResponse_ addr [] :: IO (CurlResponse_ [(String,String)] String)
print $ respHeaders r
putStr $ respBody r
Update:我试图复制你的问题,但一切都对我有用。你能发布一个简短、独立、可编译、示例 http://sscce.org/这说明了问题所在?我的代码:
import Control.Monad
import qualified Data.Conduit as C
import qualified Data.ByteString.Lazy as LBS
import Network.HTTP.Conduit
simpleHttp'' :: String -> Manager -> C.ResourceT IO (Response LBS.ByteString)
simpleHttp'' url manager = do
request <- parseUrl url
httpLbs request manager
main :: IO ()
main = do
let url = "http://i.imgur.com/"
count = 100
rs <- withManager $ \m -> replicateM count (simpleHttp'' url m)
mapM_ (print . responseStatus) $ rs
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)