最近实现了一个简单的CHttpSession类,用来请求制定URL的网页,支持POST传送方式和cookie机制。当然使用了CInternetSession,CHttpConnection和CHttpFile类,但我没有继承CInternetSession类。
POST支持的函数如下:
BOOL CHttpSession::SendData(CHttpFile * pFile,LPCSTR pszPostForm /**/ /*=NULL*/ ) ... { ASSERT(pFile!=NULL); BOOL bResult=TRUE; if(pszPostForm!=NULL) ...{ CString strFormData(pszPostForm); //post data CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded"); // URL-encoded form variables - bResult=pFile->SendRequest(strHeaders, (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength()); TRACE("post data:%s/n",pszPostForm); } else ...{ bResult=pFile->SendRequest(); } CString strReqHead,strRepHead; if(bResult) ...{ //#ifdef _DEBUG DWORD dw=1; pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF,strRepHead); pFile->QueryInfoStatusCode(_nStatus); BOOL bResult=TRUE; bResult=pFile->QueryInfo(HTTP_QUERY_FLAG_REQUEST_HEADERS|HTTP_QUERY_RAW_HEADERS_CRLF, strReqHead.GetBufferSetLength(dw),&dw,0); if(!bResult && GetLastError()==ERROR_INSUFFICIENT_BUFFER) ...{ bResult=pFile->QueryInfo(HTTP_QUERY_FLAG_REQUEST_HEADERS|HTTP_QUERY_RAW_HEADERS_CRLF, strReqHead.GetBufferSetLength(dw),&dw,0); } //szBuffer[dw]='/0'; //strReqHead=CString(szBuffer); //int nLen=strReqHead.ReverseFind('/n')+1; strReqHead.ReleaseBuffer(dw); //CString strTmp; //strTmp.Format("http req head:/n%s/n/n http rep head:/n%s",strReqHead,strRepHead); //TRACE(strTmp); //#endif TRACE("http req head:/n%s/n",strReqHead); TRACE("http rep head:/n%s/n",strRepHead); _strRepHead=strRepHead; _strReqHead=strReqHead; } else ...{ TRACE("send req error!/n"); } return bResult; }
URL的form格式编码是在网上搜到的;
设置COOKIE相对简单些,直接调用CInternetSession类中的函数实现:
void CHttpSession::GetCookie(CString & strCookie,LPCTSTR pszUrl) ... { ASSERT(AfxIsValidString(pszUrl)); //cookie叠加 if(IsSameSite(_strUrl,pszUrl)) ...{ TRACE("same site for cookie!/n"); } //得到存储的cookie strCookie=_T(""); DWORD dwCookieLen=CInternetSession::GetCookieLength(pszUrl,""); if(dwCookieLen>0) ...{ BOOL bRet=CInternetSession::GetCookie(pszUrl, "", strCookie); //strCookie.ReleaseBuffer(2*dwCookieLen/sizeof(TCHAR)); TRACE("cookie=%s/n",strCookie); if(!bRet) ...{ strCookie=_T(""); TRACE("得到cookie失败!/n"); } } _strUrl=CString(pszUrl); }
类的引用格式如下:
CHttpSession httpSession;
httpSession.SetStatusWnd(GetDlgItem(IDC_EDIT1)); //指定接收消息的窗口
try{
httpSession.SetHead(_T("Accept-Language"),_T("zh-cn"));
httpSession.SetHead(_T("pragma"),_T("by luo31"));
httpSession.SetHead(_T("Connection"),_T("Keep-Alive"));
httpSession.SetHead(_T("Referer"),_T(http://www.sohu.com/login.html));
httpSession.SetPost(_T("UserID"),_T("luo31"));
httpSession.SetPost(_T("Password"),_T("iloveu"));
httpSession.SetPost(_T("confirm"),_T("确 定"));
httpSession.StartPostReq("http://www.sohu.com/login.html/login.asp");
//AfxMessageBox(httpSession.GetReqHead());
httpSession.EndReq();
//go session
httpSession.SetHead(_T("Accept-Language"),_T("zh-cn"));
httpSession.SetHead(_T("pragma"),_T("by luo31"));
httpSession.SetHead(_T("Connection"),_T("Keep-Alive"));
httpSession.SetHead(_T("Referer"),_T("http://www.sohu.com/login.html/main.asp"));
httpSession.StartGetReq("http://www.sohu.com/login.html/mail.asp");
httpSession.SaveHtmlFile("mail.htm"); //存储目标文件
//AfxMessageBox(httpSession.GetReqHead());
httpSession.EndReq();
//ok
AfxMessageBox("ok!");
}
catch(CInternetException* e)
{
e->ReportError();
e->Delete();
}