您的位置:首页 > 理论基础 > 计算机网络

MFC之HTTP post请求

2016-04-29 14:53 381 查看
一、建立会话(Session)对象:

     CInternetSession mysession;

二、连接到Http服务器:

      CHttpConnection *myconn=mysession.GetHttpConnection("www.baidu.com");

三、打开Http请求:

      CHttpFile *myfile=myconn->OpenRequest("GET","/index.html");

四、发送Http请求:

      myfile->SendRequest();

五、从服务器读取字节流(bytes):

      CString mystr;

      CString tmp;

      while(myfile->ReadString(tmp))

      {

           mystr+=tmp;

      }

六、释放资源:

     myfile->Close();

  
4000
    myconn->Close();

     mysession.Close();

     delete myfile;

     delete myconn;

     myfile=0;

     myconn=0;

     步骤基本如上,上例各函数参数主要使用默认参数,具体函数声明请查阅MSDN。另外别忘了异常处理!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1、下载文件

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;

 

 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,&dwInf
e753
oBufferSize,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; 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: