以下是一个使用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请求发送和接收的应用程序dome

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

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