haskell 增加Network.HTTP.Conduit的请求超时

neskvpey  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(70)

我使用http-conduit库版本2.0+从HTTP Web服务获取内容:

import Network.HTTP.Conduit
main = do content <- simpleHttp "http://stackoverflow.com"
          print $ content

如文档中所述,默认超时为5秒。

  • 注:* 我立即回答了这个问题,因此故意不显示进一步的研究工作。
dgsult0t

dgsult0t1#

类似于this previous question,你不能单独使用simpleHttp。您需要同时使用ManagerhttpLbs才能设置超时。
请注意,您不需要在管理器中设置超时,但您可以为每个请求单独设置它。
下面是一个完整的示例,其行为与上面的函数类似,但允许您修改超时:

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
xn1cxnb4

xn1cxnb42#

我发现以下是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

r55awzrz

r55awzrz3#

目前,Int不能隐式转换为ResponseTimeout,需要responseTimeoutMicro来转换Int

import Network.HTTP.Conduit (parseRequest, responseTimeoutMicro)
import Network.HTTP.Simple (
    getResponseBody,
    httpBS,
    setRequestResponseTimeout,
 )
import Prelude

main :: IO ()
main = do
    req <- parseRequest "https://stackoverflow.com"
    let timeout = responseTimeoutMicro 60000000
    let req' = setRequestResponseTimeout timeout req
    resp <- httpBS req
    let content = getResponseBody resp
    print content

相关问题