在请求之间共享http Manager

时间:2018-08-22 23:52:11

标签: haskell

我正在使用库http-client和http-client-tls发出http请求。

文档https://haskell-lang.org/library/http-client提到“强烈建议在整个应用程序中共享Manager的价值”

如果我正在构建一个将String作为API主机的函数(即“ http://localhost:3030”或“ https://www.example.org”)并向其发出请求,是否需要创建两个管理器-如果API主机为http,则HTTP管理器在HTTP请求之间共享;如果API主机为https,则需要创建HTTP管理器在https请求之间共享?

在请求之间“共享” Manager的最佳实践是什么?

是否可以拥有一个或多个全局共享的Manager(ssl和non-ssl)?由于无论如何都会在IO中发送http请求,因此可以在IO中创建全局共享的Manager,然后在发送http / https请求时在IO中读取相应的Manager。

1 个答案:

答案 0 :(得分:3)

这几天,我只使用getGlobalManager。最近,Yesod还默认使用此功能。另外,您不需要为http和https使用单独的管理器。演示示例:

#!/usr/bin/env stack
-- stack script --resolver lts-12.7
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.ByteString.Lazy.Char8 as L8
import           Network.HTTP.Client        (defaultManagerSettings, Manager)
import           Network.HTTP.Simple
import Network.HTTP.Client.TLS (getGlobalManager)

main :: IO ()
main = do
    manager <- getGlobalManager

    printResponse manager "http://httpbin.org/get"
    printResponse manager "https://google.com"

printResponse :: Manager -> Request -> IO ()    
printResponse mgr url = do
  let request = setRequestManager mgr url
  response <- httpLBS request

  putStrLn $ "The status code was: " ++  show (getResponseStatusCode response)
  print $ getResponseHeader "Content-Type" response
  L8.putStrLn $ getResponseBody response