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"
答
如果您只想获取一页,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
你不应该接受这个答案;因为SO是为了每个人的利益 - 有一个公开的问题会刺激更多的答案(甚至是发展)。 – drozzy 2012-04-03 02:33:46
@drozzy即使答案已被排除,仍然值得回答。 http-conduit是一个更新的包,似乎是解决问题的更方便的答案。 – Davorak 2012-11-20 02:32:47