C++ 之HTTP post请求

一、建立会话(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();
     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)
   returnfalse;
  DWORD dwStateCode;

 

  pHttpFile->QueryInfoStatusCode(dwStateCode);
  if(dwStateCode ==HTTP_STATUS_OK)
  {
    HANDLEhFile = 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();
    returnfalse;
   }
 
   charszInfoBuffer[1000];  //返回消息
   DWORDdwFileSize =0;   //文件长度
   DWORDdwInfoBufferSize = sizeof(szInfoBuffer);
   BOOL bResult= FALSE;
   bResult =pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,
           (void*)szInfoBuffer,&dwInfoBufferSize,NULL);

 

   dwFileSize= atoi(szInfoBuffer);
   const intBUFFER_LENGTH = 1024 * 10;
   pszBuffer =newchar[BUFFER_LENGTH];  //读取文件的缓冲
   DWORDdwWrite, 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();
    deletepHttpFile;
    pHttpFile= NULL;
   }
   if(pHttpConnection!= NULL)
   {
    pHttpConnection->Close();
    deletepHttpConnection;
    pHttpConnection= NULL;
   }
   session.Close();
    returnfalse;
  }
 }
 catch(...)
 {
  delete[]pszBuffer;
  pszBuffer = NULL;
  if(pHttpFile != NULL)
  {
   pHttpFile->Close();
   deletepHttpFile;
   pHttpFile =NULL;
  }
  if(pHttpConnection !=NULL)
  {
   pHttpConnection->Close();
   deletepHttpConnection;
   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->GetErrorM

你可能感兴趣的:(C++ 之HTTP post请求)