C++ WinHTTP 请求发送和接收示例

这是一个使用 WinHTTP 发送和接收 HTTP 请求的简单 C++ 代码示例:

#include <windows.h>
#include <winhttp.h>
#include <iostream>
#include <string>

#pragma comment(lib, "winhttp.lib")

using namespace std;

int main()
{
    // 创建一个 WinHTTP 会话句柄
    HINTERNET hSession = WinHttpOpen(L"MyApp", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
    if (!hSession)
    {
        cout << "Failed to create WinHTTP session: " << GetLastError() << endl;
        return 1;
    }

    // 创建一个 WinHTTP 连接句柄
    HINTERNET hConnect = WinHttpConnect(hSession, L"www.example.com", INTERNET_DEFAULT_HTTP_PORT, 0);
    if (!hConnect)
    {
        cout << "Failed to create WinHTTP connection: " << GetLastError() << endl;
        WinHttpCloseHandle(hSession);
        return 1;
    }

    // 创建一个 WinHTTP 请求句柄
    HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/index.html", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
    if (!hRequest)
    {
        cout << "Failed to create WinHTTP request: " << GetLastError() << endl;
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return 1;
    }

    // 发送 WinHTTP 请求
    if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0))
    {
        cout << "Failed to send WinHTTP request: " << GetLastError() << endl;
        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return 1;
    }

    // 接收 WinHTTP 响应
    if (!WinHttpReceiveResponse(hRequest, NULL))
    {
        cout << "Failed to receive WinHTTP response: " << GetLastError() << endl;
        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return 1;
    }

    // 获取 WinHTTP 响应状态码
    DWORD dwStatusCode = 0;
    DWORD dwSize = sizeof(dwStatusCode);
    WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwSize, NULL);

    // 获取 WinHTTP 响应头信息
    wstring strHeaders;
    dwSize = 0;
    WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &dwSize, WINHTTP_NO_HEADER_INDEX);
    if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    {
        wchar_t* pBuffer = new wchar_t[dwSize / sizeof(wchar_t)];
        if (WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, pBuffer, &dwSize, WINHTTP_NO_HEADER_INDEX))
        {
            strHeaders = pBuffer;
        }
        delete[] pBuffer;
    }

    // 获取 WinHTTP 响应内容
    string strContent;
    DWORD dwReadSize = 0;
    do
    {
        char szBuffer[1024];
        if (!WinHttpReadData(hRequest, szBuffer, sizeof(szBuffer), &dwReadSize))
        {
            cout << "Failed to read WinHTTP response data: " << GetLastError() << endl;
            WinHttpCloseHandle(hRequest);
            WinHttpCloseHandle(hConnect);
            WinHttpCloseHandle(hSession);
            return 1;
        }
        if (dwReadSize > 0)
        {
            strContent.append(szBuffer, dwReadSize);
        }
    } while (dwReadSize > 0);

    // 输出 WinHTTP 响应结果
    cout << "Status code: " << dwStatusCode << endl;
    wcout << L"Headers: " << strHeaders << endl;
    cout << "Content: " << strContent << endl;

    // 关闭 WinHTTP 句柄
    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);

    return 0;
}

该代码执行以下操作:

  1. 创建一个 WinHTTP 会话句柄。
  2. 创建一个 WinHTTP 连接句柄。
  3. 创建一个 WinHTTP 请求句柄。
  4. 发送一个 HTTP GET 请求。
  5. 接收 HTTP 响应并获取响应状态码、响应头信息和响应内容。
  6. 输出 HTTP 响应结果。
  7. 关闭 WinHTTP 句柄。

请注意,此示例仅适用于发送和接收 HTTP 请求。如果要使用 HTTPS,请将 WinHttpOpen 函数的第二个参数设置为 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,并使用 WinHttpSetOption 函数设置 WINHTTP_OPTION_SECURITY_FLAGS 选项以启用 SSL。

C++ WinHTTP 请求发送和接收示例 - 简单 HTTP 应用程序

原文地址: https://www.cveoy.top/t/topic/ocjZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录