zoukankan      html  css  js  c++  java
  • MFC之Http POST请求

      一、建立会话(session)对象

      CInternetSession mysession;

      二、连接到HTTP服务器

      CHttpConnection *mysession=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)
       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;

    转自http://www.cnblogs.com/Ray-chen/archive/2011/12/14/2287812.html

  • 相关阅读:
    低级格式化
    winhex恢复误GHOST系统造成的数据丢失
    共享进程空间内容(修的进程空间代码/HOOK)
    WinDbg 入门教程
    遍历删除当前目录下所有文件
    VC/MFC非模态对话框实例
    经典SQL语句
    C++实现系统服务暂停、停止、启动
    汇编中的管道操作方法
    Dll2lib探究
  • 原文地址:https://www.cnblogs.com/wjq13752525588/p/12188487.html
Copyright © 2011-2022 走看看