91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

如何用C++ WinHttp實現HTTPS請求

c++
小樊
157
2024-08-29 16:53:00
欄目: 編程語言

要使用C++和WinHttp庫實現HTTPS請求,請按照以下步驟操作:

  1. 首先,確保已經安裝了Windows SDK,因為它包含了WinHttp庫。

  2. 在你的C++項目中,包含必要的頭文件:

#include<iostream>
#include<windows.h>
#include <winhttp.h>
#pragma comment(lib, "winhttp")
  1. 編寫一個函數來發送HTTPS請求:
void SendHttpsRequest(const std::wstring& url) {
    // 打開WinHttp會話
    HINTERNET hSession = WinHttpOpen(L"MyUserAgent", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
    if (!hSession) {
        std::cerr << "Error opening session: "<< GetLastError()<< std::endl;
        return;
    }

    // 連接到服務器
    HINTERNET hConnect = WinHttpConnect(hSession, url.c_str(), INTERNET_DEFAULT_HTTPS_PORT, 0);
    if (!hConnect) {
        std::cerr << "Error connecting to server: "<< GetLastError()<< std::endl;
        WinHttpCloseHandle(hSession);
        return;
    }

    // 打開請求
    HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", nullptr, nullptr, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);
    if (!hRequest) {
        std::cerr << "Error opening request: "<< GetLastError()<< std::endl;
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return;
    }

    // 發送請求
    BOOL bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
    if (!bResults) {
        std::cerr << "Error sending request: "<< GetLastError()<< std::endl;
        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return;
    }

    // 接收響應
    bResults = WinHttpReceiveResponse(hRequest, nullptr);
    if (!bResults) {
        std::cerr << "Error receiving response: "<< GetLastError()<< std::endl;
        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return;
    }

    // 讀取響應內容
    DWORD dwSize = 0;
    do {
        DWORD dwDownloaded = 0;
        char* pszOutBuffer;
        do {
            // 分配空間以存儲響應數據
            dwSize += 1024;
            pszOutBuffer = new char[dwSize + 1];
            if (!pszOutBuffer) {
                std::cerr << "Out of memory"<< std::endl;
                break;
            }

            // 查詢可用數據量
            bResults = WinHttpQueryDataAvailable(hRequest, &dwDownloaded);
            if (!bResults) {
                delete[] pszOutBuffer;
                std::cerr << "Error querying data available: "<< GetLastError()<< std::endl;
                break;
            }

            // 讀取數據
            ZeroMemory(pszOutBuffer, dwSize + 1);
            bResults = WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwDownloaded, &dwDownloaded);
            if (!bResults) {
                delete[] pszOutBuffer;
                std::cerr << "Error reading data: "<< GetLastError()<< std::endl;
                break;
            }

            // 輸出數據
            std::cout << pszOutBuffer;

            // 釋放內存
            delete[] pszOutBuffer;
        } while (dwDownloaded > 0);
    } while (dwDownloaded > 0);

    // 關閉句柄
    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);
}
  1. 在主函數中調用這個函數:
int main() {
    SendHttpsRequest(L"example.com");
    return 0;
}
  1. 編譯并運行程序。它將發送一個HTTPS GET請求到指定的URL,并輸出響應內容。

注意:這個示例僅用于演示目的。在實際項目中,你可能需要處理更多的錯誤情況,例如內存分配失敗、無效的URL等。此外,你還可以根據需要添加其他功能,例如設置請求頭、發送POST請求等。

0
金乡县| 东辽县| 拜城县| 望都县| 肥西县| 车险| 黄大仙区| 施秉县| 定陶县| 建瓯市| 隆化县| 资溪县| 邢台市| 政和县| 钟祥市| 汶川县| 新营市| 德清县| 仙桃市| 锦屏县| 凯里市| 奉新县| 孟津县| 宾阳县| 云南省| 益阳市| 东至县| 昌邑市| 仁化县| 尤溪县| 西安市| 邵阳县| 宜兴市| 泰来县| 五大连池市| 鄄城县| 满洲里市| 宁都县| 新巴尔虎右旗| 长子县| 开远市|