Haskell Network.Browser HTTPS-соединение - PullRequest
15 голосов
/ 21 октября 2010

Есть ли способ совершать 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"

Ответы [ 3 ]

12 голосов
/ 20 ноября 2012

Альтернативное и, возможно, более «простое» решение, как сказал Трэвис Браун: http -озиум:

Чтобы просто получить 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

Вы также можете установить метод, тип содержимого и тело запроса вручную.API такой же, как в http-enumerator, хороший пример: https://stackoverflow.com/a/5614946

8 голосов
/ 21 октября 2010

Я задавался вопросом об этом в прошлом и всегда заканчивал тем, что использовал привязки libcurl . Было бы неплохо иметь более простое решение на Haskelly, но Network.Curl очень удобно.

3 голосов
/ 23 мая 2011

Если все, что вы хотите сделать, это получить страницу, то Network.HTTP.Wget - самый простой способ.Экспонат:

import Network.HTTP.Wget

main = putStrLn =<< wget "https://www.google.com" [] []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...