Ответ 1
Я задавался вопросом об этом в прошлом и всегда использовал только привязки libcurl. Было бы неплохо иметь более решение Haskell, но Network.Curl
очень удобно.
Есть ли способ сделать https-вызовы с помощью пакета Network.Browser.
Я не вижу его в документации в Hackage.
Если нет способа сделать это с помощью просмотра, есть ли другой способ для извлечения https-страниц?
Мой текущий тестовый код
import Network.HTTP
import Network.URI (parseURI)
import Network.HTTP.Proxy
import Data.Maybe (fromJust)
import Control.Applicative ((<$>))
import Network.Browser
retrieveUrl :: String -> IO String
retrieveUrl url = do
rsp <- browse $ request (Request (fromJust uri) POST [] "Body")
return $ snd (rspBody <$> rsp)
where uri = parseURI url
Я запускал nc -l -p 8000 и смотрел вывод. Я вижу, что он не шифрует его, когда я делаю retrieveUrl https://localhost:8000
Также, когда я пытаюсь создать настоящий https-сайт, я получаю:
Network.Browser.request: Error raised ErrorClosed
*** Exception: user error (Network.Browser.request: Error raised ErrorClosed)
Изменить: решение Network.Curl(для вызова SOAP)
import Network.Curl (curlGetString)
import Network.Curl.Opts
soapHeader s = CurlHttpHeaders ["Content-Type: text/xml", "SOAPAction: " ++ s]
proxy = CurlProxy "proxy.foo.org"
envelope = "myRequestEnvelope.xml"
headers = readFile envelope >>= (\x -> return [ soapHeader "myAction"
, proxy
, CurlPost True
, CurlPostFields [x]])
main = headers >>= curlGetString "https://service.endpoint"
Я задавался вопросом об этом в прошлом и всегда использовал только привязки libcurl. Было бы неплохо иметь более решение Haskell, но Network.Curl
очень удобно.
Альтернативное и, возможно, более "haskelly" решение, как Трэвис Браун, поставил его с помощью http-conduit:
Чтобы просто извлечь https-страницы:
import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L
main = simpleHttp "https://www.noisebridge.net/wiki/Noisebridge" >>= L.putStr
Ниже показано, как передать параметры urlencode.
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L
main = do
initReq <- parseUrl "https://www.googleapis.com/urlshortener/v1/url"
let req' = initReq { secure = True } -- Turn on https
let req = (flip urlEncodedBody) req' $
[ ("longUrl", "http://www.google.com/")
-- ,
]
response <- withManager $ httpLbs req
L.putStr $ responseBody response
Вы также можете вручную установить метод, тип контента и тело запроса. Апи такой же, как в http-enumerator, хорошим примером является: fooobar.com/questions/223921/...
Если все, что вы хотите сделать, это получить страницу, Network.HTTP.Wget - самый простой способ. Экспозиция a:
import Network.HTTP.Wget
main = putStrLn =<< wget "https://www.google.com" [] []