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(),避免控制代碼洩漏。 |
DWORD dwFlags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE;
pFile = (CHttpFile*)session.OpenURL(url, 1, NULL, NULL, dwFlags);
CInternetSession session(_T("MyApp"), 1, INTERNET_OPEN_TYPE_PROXY,
_T("proxy.mycompany.com:8080"), NULL, 0);
同樣使用 https:// 開頭的 URL,WinInet 會自動處理 SSL/TLS 握手;若憑證驗證失敗,可設定 INTERNET_FLAG_IGNORE_CERT_CN_INVALID 等旗標 (僅測試環境使用)。
CInternetSession 適合簡單 MFC 專案快速整合 HTTP GET/POST。生產環境請務必加入超時設定、重試機制、憑證驗證、大檔案分塊下載等健壯性邏輯。