我正在使用库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。
答案 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