我使用http-conduit
库版本 2.0+ 从 HTTP 网络服务获取内容:
import Network.HTTP.Conduit
main = do content <- simpleHttp "http://stackoverflow.com"
print $ content
如文档中所述,默认超时为 5 秒。
注意:我立即回答了这个问题,因此故意不显示进一步的研究工作。
我使用http-conduit
库版本 2.0+ 从 HTTP 网络服务获取内容:
import Network.HTTP.Conduit
main = do content <- simpleHttp "http://stackoverflow.com"
print $ content
如文档中所述,默认超时为 5 秒。
注意:我立即回答了这个问题,因此故意不显示进一步的研究工作。
与上一个问题类似,您不能simpleHttp
单独这样做。您需要将 aManager
与 with 一起使用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
我发现以下是 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
not Network.HTTP.getResponseBody
。