我使用http-conduit
库版本2.0+从HTTP webservice获取内容:
import Network.HTTP.Conduit
main = do content <- simpleHttp "http://stackoverflow.com"
print $ content
如上所述in the docs,默认超时为5秒。
注意:我立即回答了这个问题,因此故意没有进一步的研究工作。
答案 0 :(得分:1)
与this previous question类似,仅凭simpleHttp
无法做到这一点。您需要将Manager
与httpLbs
一起使用才能设置超时。
请注意,您无需在管理器中设置超时,但可以单独为每个请求设置超时。
这是一个完整的示例,其行为与上面的函数类似,但允许您修改超时:
import Network.HTTP.Conduit
import Control.Monad (liftM)
import qualified Data.ByteString.Lazy.Char8 as LB
-- | A simpleHttp alternative that allows to specify the timeout
-- | Note that the timeout parameter is in microseconds!
downloadHttpTimeout :: Manager -> String -> Int -> IO LB.ByteString
downloadHttpTimeout manager url timeout = do req <- parseUrl url
let req' = req {responseTimeout = Just timeout}
liftM responseBody $ httpLbs req' manager
main = do manager <- newManager conduitManagerSettings
let timeout = 15000000 -- Microseconds --> 15 secs
content <- downloadHttpTimeout manager "http://stackoverflow.com" timeout
print $ content
答案 1 :(得分:1)
我发现以下内容是Uli的downloadHttpTimeout
版本,更接近simpleHTTP
:
simpleHTTPWithTimeout :: Int -> Request a -> IO (Response LB.ByteString)
simpleHTTPWithTimeout timeout req =
do mgr <- newManager tlsManagerSettings
let req = req { responseTimeout = Just timeout }
httpLbs req mgr
唯一的区别是simpleHTTP
是稍微不同的返回类型,所以提取例如响应主体,使用管道responseBody
而非Network.HTTP.getResponseBody
。