http-conduit 浏览器使用



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

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

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

  1. 处理自签名证书(我设法在基本模块中使用管理器检查证书执行此操作(
  2. 发送一个在正文中包含 URL 编码参数的 POST 请求,不遵循任何重定向(我为此使用了基本模块中的 urlEncodedBody(
  3. 在一个简单的GET请求中使用2.步骤中的cookie,并将响应读取为(惰性(字节字符串(我会为此使用httpLbs(

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

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

  1. 做你正在做的同样的事情。使用正确的managerCheckCerts创建Manager后,将其传递给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 中。这实际上是浏览器真正所做的一切。

相关内容

  • 没有找到相关文章

最新更新