我正在尝试使用HTTPS从站点抓取数据。我设法成功地使用Network.HTTP.Conduit发出基本请求(发布凭据等(,但未能从响应标头(Set-Cookie(中提取cookie信息。看起来http-conduit有自己的机制来处理cookie,但我无法理解。
Network.HTTP.Conduit.Browser似乎会自动处理cookie(这对我来说很好(,但由于缺乏文档,我无法让它工作。
有更多处理 http-conduit 浏览器模块经验的人可以告诉我如何:
- 处理自签名证书(我设法在基本模块中使用管理器检查证书执行此操作(
- 发送一个在正文中包含 URL 编码参数的 POST 请求,不遵循任何重定向(我为此使用了基本模块中的 urlEncodedBody(
- 在一个简单的GET请求中使用2.步骤中的cookie,并将响应读取为(惰性(字节字符串(我会为此使用httpLbs(
对我来说,与Network.HTTP.Conduit相比,Network.HTTP.Conduit.Browser的抽象级别似乎更适合我的应用程序,因此即使我可以使用后者手动处理cookie,我也想进行切换。
我从未使用过浏览器,但我使用过http-conduit。我阅读了源代码来回答这些问题,如果我犯了任何错误,我深表歉意。
-
做你正在做的同样的事情。使用正确的
managerCheckCerts
创建Manager
后,将其传递给browse :: Manager -> BrowserAction a -> ResourceT IO a
。 -
makeRequest :: Request IO -> BrowserAction (Response (Source IO BS.ByteString))
需要Request IO
;像以前一样使用urlEncodedBody
创建一个带有参数的POST请求并将其传递给makeRequest
。我相信,将redirectCount
设置为 0 以禁用重定向跟踪。 -
我相信你只需要使用
getCookieJar :: BrowserAction CookieJar
;BrowserAction
来自getBrowserState :: BrowserAction BrowserState
。
http-conduit 在浏览器模块之外管理 cookie 的方式是它没有。Cookie 在 HTTP 响应中返回;您可以做的是解析响应并将 cookie 存储在 cookie jar 中。这实际上是浏览器真正所做的一切。