首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 使用 CInternetSession 抓取網頁內容完整範例

     編輯:VC 教學

前言

MFC CInternetSession 搭配 CHttpFile 提供簡單的 HTTP 客戶端功能。本文提供完整、可編譯的主控台程式範例,示範 GET 請求、狀態碼檢查、串流讀取內容、資源釋放等關鍵步驟,並補充常見坑點與現代替代方案。

完整範例程式碼 (主控台應用程式)

#include <afxinet.h>
#include <stdio.h>
#include <tchar.h>

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

int _tmain(int argc, TCHAR* argv[])
{
    // 1. 初始化 MFC (主控台專案需手動呼叫)
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
        _tprintf(_T("MFC 初始化失敗\n"));
        return 1;
    }

    CInternetSession session(_T("HttpClient/1.0"));
    CHttpFile* pFile = NULL;
    CString url = _T("https://www.example.com/api/data"); // 替換為實際 URL

    try {
        // 2. 開啟 URL,取得 CHttpFile 指標
        pFile = (CHttpFile*)session.OpenURL(url, 1, NULL, NULL); // 1 = INTERNET_FLAG_TRANSFER_ASCII

        // 3. 檢查 HTTP 狀態碼
        DWORD dwStatusCode = 0;
        pFile->QueryInfoStatusCode(dwStatusCode);

        if (dwStatusCode == HTTP_STATUS_OK) {
            CString content, line;
            while (pFile->ReadString(line)) {
                content += line + _T("\r\n");
            }
            content.TrimRight();
            _tprintf(_T("內容長度: %d 字元\n%s\n"), content.GetLength(), (LPCTSTR)content);
        } else {
            _tprintf(_T("HTTP 錯誤: %lu\n"), dwStatusCode);
        }
    }
    catch (CInternetException* pEx) {
        TCHAR szErr[256];
        pEx->GetErrorMessage(szErr, 255);
        _tprintf(_T("網路例外: %s (錯誤碼: %d)\n"), szErr, pEx->m_dwError);
        pEx->Delete();
    }
    catch (CMemoryException*) {
        _tprintf(_T("記憶體不足\n"));
    }

    // 4. 釋放資源 (順序重要)
    if (pFile) {
        pFile->Close();
        delete pFile;
    }
    session.Close();

    return 0;
}

關鍵點解析

步驟說明
AfxWinInit主控台專案必須手動初始化 MFC,否則 CInternetSession 會斷言失敗。
OpenURL 參數第 2 參數為 dwContext,第 3/4 參數可傳 NULL 使用預設標頭/POST 資料。
QueryInfoStatusCode取得 HTTP 回應碼,務必檢查為 HTTP_STATUS_OK (200) 才讀取內容。
ReadString逐行讀取,自動處理換行符;大檔案建議改用 Read 配合緩衝區。
例外處理捕捉 CInternetException 可取得詳細 WinInet 錯誤碼 (如 ERROR_INTERNET_TIMEOUT)。
資源釋放順序先 Close() 再 delete,最後 session.Close(),避免控制代碼洩漏。

常見進階需求

1. 忽略快取 (強制重新下載)

DWORD dwFlags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE;
pFile = (CHttpFile*)session.OpenURL(url, 1, NULL, NULL, dwFlags);

2. 使用 Proxy

CInternetSession session(_T("MyApp"), 1, INTERNET_OPEN_TYPE_PROXY,
    _T("proxy.mycompany.com:8080"), NULL, 0);

3. HTTPS 支援

同樣使用 https:// 開頭的 URL,WinInet 會自動處理 SSL/TLS 握手;若憑證驗證失敗,可設定 INTERNET_FLAG_IGNORE_CERT_CN_INVALID 等旗標 (僅測試環境使用)。

現代替代方案建議

  • WinHTTP (WinHttp.lib):更適合服務端/高併發,支援非同步、連線池。
  • libcurl:跨平台、功能最完整、支援 HTTP/2、HTTP/3。
  • C++ REST SDK (Casablanca):現代 C++ 非同步 HTTP 客戶端。
  • Windows::Web::Http (UWP/WinRT):通用 Windows 平台首選。

總結

CInternetSession 適合簡單 MFC 專案快速整合 HTTP GET/POST。生產環境請務必加入超時設定、重試機制、憑證驗證、大檔案分塊下載等健壯性邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved