Haskell Network.Browser HTTPS连接

问题描述:

是否有方法使用Network.Browser包进行https调用。 我在documentation on Hackage中看不到它。
如果没有办法做到浏览有另一种方式来获取HTTPS页面?Haskell Network.Browser 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,看输出。 我看到,当我尝试一个真正的HTTPS站点,我得到它没有当我做retrieveUrl https://localhost:8000

而且它加密:

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" 
+0

你不应该接受这个答案;因为SO是为了每个人的利益 - 有一个公开的问题会刺激更多的答案(甚至是发展)。 – drozzy 2012-04-03 02:33:46

+0

@drozzy即使答案已被排除,仍然值得回答。 http-conduit是一个更新的包,似乎是解决问题的更方便的答案。 – Davorak 2012-11-20 02:32:47

我在过去一直在想这件事,并且总是以使用libcurl bindings结束。这将是很好有一个更多的Haskelly解决方案,但Network.Curl是非常方便。

+0

是的,我最终根据你的建议与Network.Curl一起去​​了,谢谢你的帮助。 – devrand 2010-10-21 17:18:18

+4

那么,Network.HTTP根本不支持HTTPS? – 2011-04-04 20:47:04

+0

这将在Windows上工作吗? – drozzy 2012-04-03 02:34:27

如果您只想获取一页,Network.HTTP.Wget是最简单的方法。附录A:

import Network.HTTP.Wget 

main = putStrLn =<< wget "https://www.google.com" [] [] 

另一种也许更 “haskelly” 解决方案,特拉维斯 - 布朗把它与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://*.com/a/5614946