1. 程式人生 > >VC連線HTTP伺服器 & MFC 處理 HTTP 請求的基本方法

VC連線HTTP伺服器 & MFC 處理 HTTP 請求的基本方法

用 MFC 發起 HTTP Post 請求,主要流程和 MFC HTTP Get 程式碼一樣,以下是示例程式碼:

//通過 http POST 協議來發送命令給伺服器
CInternetSession session;
session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 1000 * 20);
session.SetOption(INTERNET_OPTION_CONNECT_BACKOFF, 1000);
session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);

CHttpConnection* pConnection = session.GetHttpConnection( TEXT("localhost"),
                                                          (INTERNET_PORT)8080);
CHttpFile* pFile = pConnection->OpenRequest( CHttpConnection::HTTP_VERB_POST,
                                             TEXT("/Practice/RequestObjectInJSP.jsp"),
                                             NULL,
                                             1,
                                             NULL,
                                             TEXT("HTTP/1.1"),
                                             INTERNET_FLAG_RELOAD);

//需要提交的資料
CString szHeaders   = L"Content-Type: application/x-www-form-urlencoded;";

//下面這段編碼,則是可以讓伺服器正常處理
CHAR* strFormData = "username=WaterLin&password=TestPost";
pFile->SendRequest( szHeaders,
                    szHeaders.GetLength(),
                    (LPVOID)strFormData,
                    strlen(strFormData));

DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);

if(dwRet != HTTP_STATUS_OK)
{
    CString errText;
    errText.Format(L"POST出錯,錯誤碼:%d", dwRet);
    AfxMessageBox(errText);
}
else
{
    int len = pFile->GetLength();
    char buf[2000];
    int numread;
    CString filepath;
    CString strFile = L"result.html";
    filepath.Format(L".\\%s", strFile);
    CFile myfile(filepath,
        CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
    while ((numread = pFile->Read(buf,sizeof(buf)-1)) > 0)
    {
        buf[numread] = '\0';
        strFile += buf;
        myfile.Write(buf, numread);
    }
    myfile.Close();
}

session.Close();
pFile->Close(); 
delete pFile;

以上的程式碼,與 Get 對比起來,唯一的不同在於,提交 CHttpFile::SendRequest() 資料的時候,把表單的資料也帶上了。