wininet的使用(http)

wininet的使用(http)

基于微软公司的动态链接库 wininet.dll

第一 创建 Session .

       使用 InternetOpen 获得一个 Session 句柄

lpszAgent-为任意的一个字符串

dwAccessType 类型

       INTERNET_OPEN_TYPE_DIRECT

       INTERNET_OPEN_TYPE_PRECONFIG

INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY

INTERNET_OPEN_TYPE_PROXY

              1 使用代理

                     dwAccessType 选择 INTERNET_OPEN_TYPE_PROXY

              2 不使用代理

                                          dwAccessType选择 INTERNET_OPEN_TYPE_DIRECT

第二 创建连接

       使用 InternetConnect

              参数:

                     hInternet – 选择第一步获得的session 句柄

                     lpszServerName – 选择一个服务器地址或者域名

                     nServerPort – 服务的端口号 ,一般 http服务端口为80 Ftp 服务端口为21

                     lpszUserNam – 用户名

lpszPassword – 密码

dwService – 为要选择的服务

INTERNET_SERVICE_HTTP

INTERNET_SERVICE_FTP

                     dwFlags – 如果您选择了Ftp服务那么您可以使用

                            INTERNET_FLAG_PASSIVE 被动连接

                            http服务一般为 0

                     dwContext – 在异步的时候 使用,一般同步设置的为 0

第三 发送一个请求 获得请求的句柄

       HttpOpenRequest – 获得一个句柄

              这里可以选择的动作可以是 POST 或者是 Get

       然后呢我们可以设置我们 发送的Http 头信息,比如发送一个变量 user 信息在http 头中。

第四 这步是使用 HttpSendRequest 发送一个请求到服务器

       发送完毕以后要查询一下状态码,返回 200 为正确 否则为失败

当返回 HTTP_STATUS_DENIED 或者 HTTP_STATUS_PROXY_AUTH_REQ 的时候需要通过代理连接服务器。

然后我们怎么做呢。

1 我们需要把代理服务器返回的信息全部读出来。

2 如果我们在开始的时候设置了代理那么我们需要调用

InternetSetOption  

dwOption 选择 INTERNET_OPTION_USERNAME 设置代理服务器的登录用户

然后调用 InternetSetOption  

dwOption  选择 INTERNET_OPTION_PASSWORD 设置代理服务器的登录用户名

设置完以后 再次调用第四步发送请求到服务器

如果我们在程序中没有代理的设置,那么我们应该弹出提示

使用 InternetErrorDlg 函数

第五 查询返回的头信息

使用 HttpQueryInfo

dwInfoLevel 设置为 HTTP_QUERY_RAW_HEADERS_CRLF

这里服务器可以返回给我们好多的参数

第六 读取服务器的response (响应)

       使用 InternetReadFile 读取

第七 最后 关闭 session ,connect,  request 句柄

使用 InternetCloseHandle

附代码:

BOOL CXMLTransport::SendDataToServer(
         CString strServer,
         DWORD dwPort,
         CString strObj,
         CString strHead,
         LPVOID lpData,
         DWORD dwDataLen,
         LPBYTE &lpRecvBuffer,
         DWORD &dwRecvDataLen,
         CString &strRetHeadInfo)
{
 USES_CONVERSION;
 BOOL bError=TRUE;
 HINTERNET hOpen  =NULL;
 HINTERNET hConnect =NULL;
 HINTERNET hReq  =NULL;
 DWORD dwAccType  =LOCAL_INTERNET_ACCESS;
 TCHAR szAccept[] = _T("*/*");
 LPSTR AcceptTypes[2]={0};
 DWORD dwCode  =0;
 CHAR *lpBuffer, szData[1024];  
// DWORD dwBufferSize =DATA_BLOCK;
 DWORD dwSize=0;
 DWORD  dwFlags = INTERNET_FLAG_RELOAD |
  INTERNET_FLAG_NO_CACHE_WRITE |
  INTERNET_FLAG_KEEP_CONNECTION;
 BOOL m_bUseProxy=theSysConfig.bIsUseProxyHttp;
 BOOL m_bAuth =theSysConfig.bIsUseHttpAuth;
 CString m_strProxyServer;
 CString m_strProxyUser =theSysConfig.chHttpProxyUser;
 CString m_strProxyPWD =theSysConfig.chHttpProxyUser;
 m_strProxyServer.Format(_T("http://%s:%ld"),theSysConfig.chHttpProxyName,theSysConfig.dwHttpProxyPort);

 dwRecvDataLen =0;
 
//open....
 if(m_bUseProxy)
 {
  if ( !(hOpen = InternetOpen ( _T("colorme"), 
   CERN_PROXY_INTERNET_ACCESS, m_strProxyServer, NULL, 0) ) )
  {
   ErrorOut ( GetLastError(), _T("InternetOpen"));
   LogTrace(_T("InternetOpen  Errcode=%ld"),GetLastError());
   return 0;
  }
 }
 else
 {
  if ( !(hOpen = InternetOpen (_T("colorme"), 
  LOCAL_INTERNET_ACCESS , NULL, 0, 0) ) )
  {
   ErrorOut ( GetLastError(), _T("InternetOpen"));
   LogTrace(_T("InternetOpen  Errcode=%ld"),GetLastError());
   return 0;
  }
 }

 //connect...
 if ( !(hConnect = InternetConnect ( hOpen, strServer ,
  dwPort, _T(""),  _T(""), INTERNET_SERVICE_HTTP, dwPort , 0) ) )
 {
  ErrorOut (GetLastError(), _T("InternetConnect"));
  LogTrace(_T("InternetConnect  Errcode=%ld"),GetLastError());
  return 0;
 }
 if ( !(hReq = HttpOpenRequest (hConnect, _T("POST"), strObj,
  HTTP_VERSION, _T(""),
  (LPCTSTR*) AcceptTypes,
  dwFlags ,0 )))
 {
  ErrorOut (GetLastError(), _T("HttpOpenRequest"));
  LogTrace(_T("HttpOpenRequest  Errcode=%ld"),GetLastError());
  return 0;
 }
 if ( !HttpAddRequestHeaders (hReq, strHead, strHead.GetLength(), HTTP_ADDREQ_FLAG_ADD))
 {
  ErrorOut (GetLastError(), _T("HttpSendRequest"));
  LogTrace(_T("HttpAddRequestHeaders  Errcode=%ld"),GetLastError());
  bError=TRUE;
  goto RET;
 }
again:
 
 do {
   if ( !HttpSendRequest (hReq, NULL, 0, lpData, dwDataLen))
   {
    ErrorOut (GetLastError(), _T("HttpSendRequest"));
    LogTrace(_T("HttpSendRequest  Errcode=%ld"),GetLastError());
    break;
   }

   dwSize = sizeof (DWORD) ; 
   if ( !HttpQueryInfo (hReq, HTTP_QUERY_STATUS_CODE |
    HTTP_QUERY_FLAG_NUMBER, &dwCode, &dwSize, NULL))
   {
    ErrorOut (GetLastError(), _T("HttpQueryInfo"));
    LogTrace(_T("HttpQueryInfo  Errcode=%ld"),GetLastError());
    break;
   }
   bError=FALSE;
 } while(FALSE);
 //出错则处理错误.
 if(bError)
 {
  goto RET;
 }
 bError=TRUE;
 do {
  if ( dwCode == HTTP_STATUS_DENIED || dwCode ==
   HTTP_STATUS_PROXY_AUTH_REQ)
  { 
   do
   {
    InternetReadFile (hReq, (LPVOID)szData, 1000, &dwSize);
   }
   while (dwSize != 0);
   
   if (m_bAuth) //是否认证
   {
    if(!SetProxyUserPWD(hConnect,(LPCTSTR)m_strProxyUser,(LPCTSTR)m_strProxyPWD))
    {
     LogTrace(_T("SetProxyUserPWD  Errcode=%ld"),GetLastError());
     break;
    }   
    goto again;
   }
   else
   {
    if ( InternetErrorDlg (GetDesktopWindow(),
     hReq,
     ERROR_INTERNET_INCORRECT_PASSWORD,
     FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
     FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
     FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
     NULL) == ERROR_INTERNET_FORCE_RETRY)
     goto again;
   }
   
  }
  else
  {
   if(dwCode!=200)
   {
    break;
   }
  }
  // First time we will find out the size of the headers.
  if(!HttpQueryInfo (hReq,HTTP_QUERY_RAW_HEADERS_CRLF,  NULL, &dwSize, NULL))
  {
  // break;
  }
  lpBuffer =  new char [dwSize + 1 ];
  
  // Now we call HttpQueryInfo again to get the headers.
  if (!HttpQueryInfo (hReq,HTTP_QUERY_RAW_HEADERS_CRLF, (LPVOID)
   lpBuffer,
   &dwSize, NULL))
  {
   ErrorOut (GetLastError(), _T("HttpQueryInfo"));
   LogTrace(_T("HttpQueryInfo  Errcode=%ld"),GetLastError());
   delete [] lpBuffer;
   break;
  }
  strRetHeadInfo=(TCHAR*)lpBuffer;
  delete [] lpBuffer;
  //读取RESPONSE.
  if(!ReadResponse(hReq,lpRecvBuffer,dwRecvDataLen))
  {
   LogTrace(_T("ReadResponse  Errcode=%ld"),GetLastError());
   break;
  }
  bError=FALSE;
 } while(FALSE);

//处理清除工作
RET:
 SECURITY_CLOSE(hReq);
 SECURITY_CLOSE(hConnect);
 SECURITY_CLOSE(hOpen);
 return !bError; 
 
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值