8

我正在尝试使用 HTTPS 从站点中抓取数据。我成功地使用 Network.HTTP.Conduit 发出基本请求(发布凭据等),但未能从响应标头(Set-Cookie)中提取 cookie 信息。看起来 http-conduit 有自己的处理 cookie的机制,我无法理解。

Network.HTTP.Conduit.Browser 似乎可以自动处理 cookie(这对我来说很好),但由于缺少文档,我无法让它工作。

有更多处理 http-conduit 浏览器模块经验的人可以告诉我如何:

  1. 处理自签名证书(我设法在基本模块中使用managerCheckCerts做到了这一点)
  2. 在正文中发送带有 URL 编码参数的 POST 请求,而不遵循任何重定向(我为此使用了基本模块中的urlEncodedBody )
  3. 在简单的 GET 请求中使用 2. 步骤中的 cookie,并将响应读取为(惰性)ByteString(我会为此使用httpLbs

在我看来,与 Network.HTTP.Conduit 相比,Network.HTTP.Conduit.Browser 的抽象级别更适合我的应用程序,因此即使我可以使用后者手动处理 cookie,我也想进行切换。

4

1 回答 1

2

我从未使用过浏览器,但我使用过 http-conduit。我阅读了源代码来回答这些问题,如果我犯了任何错误,我深表歉意。

  1. 做同样的事情。当您创建了Managerwith 权限managerCheckCerts后,将其传递给browse :: Manager -> BrowserAction a -> ResourceT IO a.

  2. makeRequest :: Request IO -> BrowserAction (Response (Source IO BS.ByteString))需要一个Request IO;像以前一样使用urlEncodedBody在正文中创建带有参数的 POST 请求并将其传递给makeRequest. 我相信,设置redirectCount为 0 以禁用重定向跟踪。

  3. 我相信你只需要使用getCookieJar :: BrowserAction CookieJar; BrowserAction来自getBrowserState :: BrowserAction BrowserState. _

http-conduit 在浏览器模块之外管理 cookie 的方式是它没有。Cookie 在 HTTP 响应中返回;您可以做的是解析响应并将 cookie 存储在 cookie jar 中。这实际上是浏览器所做的一切。

于 2013-01-04T21:57:54.417 回答