一、建立会话(Session)对象:
CInternetSession mysession;
二、连接到Http服务器:
CHttpConnection *myconn=mysession.GetHttpConnection("");
三、打开Http请求:
CHttpFile *myfile=myconn->OpenRequest("GET","/index.html");
四、发送Http请求:
myfile->SendRequest();
五、从服务器读取字节流(bytes):
CString mystr; CString tmp; while(myfile->ReadString(tmp)) { mystr+=tmp; }
六、释放资源:
myfile->Close(); myconn->Close(); mysession.Close(); delete myfile; delete myconn; myfile=0; myconn=0;
步骤基本如上,上例各函数参数主要使用默认参数,具体函数声明请查阅MSDN。另外别忘了异常处理!
1、下载文件
Download(const CString& strFileURLInServer, //待下载文件的URLconst CString & strFileLocalFullPath)//存放到本地的路径{ ASSERT(strFileURLInServer != ""); ASSERT(strFileLocalFullPath != ""); CInternetSession session; CHttpConnection* pHttpConnection = NULL; CHttpFile* pHttpFile = NULL; CString strServer, strObject; INTERNET_PORT wPort;
DWORD dwType;
const int nTimeOut = 2000; session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); //重试之间的等待延时 session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); //重试次数 char* pszBuffer = NULL;
try
{ AfxParseURL(strFileURLInServer, dwType, strServer, strObject, wPort); pHttpConnection = session.GetHttpConnection(strServer, wPort); pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject); if(pHttpFile->SendRequest() == FALSE) return false; DWORD dwStateCode;
pHttpFile->QueryInfoStatusCode(dwStateCode);
if(dwStateCode == HTTP_STATUS_OK) { HANDLE hFile = CreateFile(strFileLocalFullPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); //创建本地文件 if(hFile == INVALID_HANDLE_VALUE) { pHttpFile->Close(); pHttpConnection->Close(); session.Close(); return false; } char szInfoBuffer[1000]; //返回消息 DWORD dwFileSize = 0; //文件长度 DWORD dwInfoBufferSize = sizeof(szInfoBuffer); BOOL bResult = FALSE; bResult = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, (void*)szInfoBuffer,&dwInfoBufferSize,NULL);
dwFileSize = atoi(szInfoBuffer);
const int BUFFER_LENGTH = 1024 * 10; pszBuffer = new char[BUFFER_LENGTH]; //读取文件的缓冲 DWORD dwWrite, dwTotalWrite; dwWrite = dwTotalWrite = 0; UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); //读取服务器上数据
while(nRead > 0)
{ WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL); //写到本地文件 dwTotalWrite += dwWrite; nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); }
delete[]pszBuffer;
pszBuffer = NULL; CloseHandle(hFile); } else { delete[]pszBuffer; pszBuffer = NULL; if(pHttpFile != NULL) { pHttpFile->Close(); delete pHttpFile; pHttpFile = NULL; } if(pHttpConnection != NULL) { pHttpConnection->Close(); delete pHttpConnection; pHttpConnection = NULL; } session.Close(); return false; } } catch(...) { delete[]pszBuffer; pszBuffer = NULL; if(pHttpFile != NULL) { pHttpFile->Close(); delete pHttpFile; pHttpFile = NULL; } if(pHttpConnection != NULL) { pHttpConnection->Close(); delete pHttpConnection; pHttpConnection = NULL; } session.Close(); return false; }
if(pHttpFile != NULL)
pHttpFile->Close(); if(pHttpConnection != NULL) pHttpConnection->Close(); session.Close(); return true;}2、上传文件bool Download(const CString& strFileURLInServer, //待下载文件的URL const CString & strFileLocalFullPath)//存放到本地的路径 { ASSERT(strFileURLInServer != ""); ASSERT(strFileLocalFullPath != ""); CInternetSession session; CHttpConnection* pHttpConnection = NULL; CHttpFile* pHttpFile = NULL; CString strServer, strObject; INTERNET_PORT wPort; bool bReturn = false; DWORD dwType; const int nTimeOut = 2000; session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); //重试之间的等待延时 session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); //重试次数 char* pszBuffer = NULL; try { AfxParseURL(strFileURLInServer, dwType, strServer, strObject, wPort); pHttpConnection = session.GetHttpConnection(strServer, wPort); pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject); if(pHttpFile->SendRequest() == FALSE) return false; DWORD dwStateCode; pHttpFile->QueryInfoStatusCode(dwStateCode); if(dwStateCode == HTTP_STATUS_OK) { HANDLE hFile = CreateFile(strFileLocalFullPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); //创建本地文件 if(hFile == INVALID_HANDLE_VALUE) { pHttpFile->Close(); pHttpConnection->Close(); session.Close(); return false; } char szInfoBuffer[1000]; //返回消息 DWORD dwFileSize = 0; //文件长度 DWORD dwInfoBufferSize = sizeof(szInfoBuffer); BOOL bResult = FALSE; bResult = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, (void*)szInfoBuffer,&dwInfoBufferSize,NULL); dwFileSize = atoi(szInfoBuffer); const int BUFFER_LENGTH = 1024 * 10; pszBuffer = new char[BUFFER_LENGTH]; //读取文件的缓冲 DWORD dwWrite, dwTotalWrite; dwWrite = dwTotalWrite = 0; UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); //读取服务器上数据 while(nRead > 0) { WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL); //写到本地文件 dwTotalWrite += dwWrite; nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); } delete[]pszBuffer; pszBuffer = NULL; CloseHandle(hFile); bReturn = true; } } catch(CInternetException* e) { TCHAR tszErrString[256]; e->GetErrorMessage(tszErrString, ArraySize(tszErrString)); TRACE(_T("Download XSL error! URL: %s,Error: %s"), strFileURLInServer, tszErrString); e->Delete(); } catch(...) { } if(pszBuffer != NULL) { delete[]pszBuffer; } if(pHttpFile != NULL) { pHttpFile->Close(); delete pHttpFile; } if(pHttpConnection != NULL) { pHttpConnection->Close(); delete pHttpConnection; } session.Close(); return bReturn; }