65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C++ 的简单 Windows HTTP 包装器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.26/5 (16投票s)

2008年7月31日

LGPL3

2分钟阅读

viewsIcon

194620

downloadIcon

9260

使用 WinHttp 封装,将网页内容获取到项目中,而无需将 WinHttp API 混入我的源代码中。

引言

最近我需要将一个网页的内容获取到一个项目中,并且不想在我的源代码中混入 WinHttp API,所以我创建了一个名为 WinHttpClient 的简单 WinHttp 封装。

WinHttpClient 接收一个 URL 作为参数,发送 HTTP 请求并获取响应。发送 HTTP 请求的方法是同步方法,因此不应在 UI 线程中调用。WinHttpClient 是线程安全的,这意味着它可以同时在多个线程中使用。

Using the Code

使用 WinHttpClient 非常简单。类图如下所示。

例如,获取 https://codeproject.org.cn/ 内容的代码片段如下所示。

    WinHttpClient client(L"https://codeproject.org.cn/");
    client.SendHttpRequest();
    wstring httpResponseHeader = client.GetHttpResponseHeader();
    wstring httpResponse = client.GetHttpResponse();

附加

有几点可能对您感兴趣。

  1. 方法 SendHttpRequest 是一个同步方法,它会重试多次直到成功,这会导致此方法花费很长时间才能完成。因此,不要在 UI 线程中使用它。建议创建一些工作线程并在其中使用 WinHttpClient,因为 WinHttpClient 是一个线程安全的类。
  2. 您可以解析和枚举由方法 GetHttpResponse 返回的字符串中的 URL,并获取它们的内容,然后重复此过程。这样您就可以获取整个网站的内容。
  3. 具有默认索引页面的 URL 可以很好地处理。例如
    • https://codeproject.org.cn/
    • https://codeproject.org.cn/Zones/IBM/
    • https://codeproject.org.cn/info/submit.aspx
  4. 我不太清楚 HTTP 动词如何影响结果。因此,用户可以选择使用 GET 或 POST 动词通过 SendHttpRequest 的参数发送 HTTP 请求。默认动词是 GET。

关注点

在使用 MultiByteToWideChar 转换为宽字符时,如果我将最后一个字符设置为 0,删除我创建的用于保存输出宽字符的缓冲区会导致崩溃。这很奇怪,我还没有弄清楚。

最后

这是我第一次撰写技术文章。我希望我解释清楚了所有内容。

© . All rights reserved.