2010-10-21 84 views
15

是否有方法使用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

回答

8

我在過去一直在想這件事,並且總是以使用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

3

如果您只想獲取一頁,Network.HTTP.Wget是最簡單的方法。附錄A:

import Network.HTTP.Wget 

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

另一種也許更 「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://stackoverflow.com/a/5614946