2011-04-11 91 views
2

我有一台服务器,如果我发送它“https://MyDomain/Dir1/Dir2/login.html?u = 1234 & t = 5678”将用xml文档进行响应。有谁知道我在wininet中如何做到这一点?在C++中使用wininet

这是我迄今所做的:

std::string GetLoginData(void) 
{ 
    HINTERNET hInternet, hConnection, hRequest; 
    std::string retVal; 

    hInternet = InternetOpen(L"My Application", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); 
    if(NULL != hInternet) 
    { 
     hConnection = InternetConnect(hInternet, L"MyDomain", INTERNET_DEFAULT_HTTPS_PORT, L"", L"", INTERNET_SERVICE_HTTP, 0, NULL); 
     if(NULL != hConnection) 
     { 
      const wchar_t* lplpszAcceptTypes[] = {L"text/xml", L"application/xml", L"application/xhtml+xml", NULL}; 

      hRequest = HttpOpenRequest(hConnection, L"GET", L"Dir1/Dir2/Login.html", NULL, NULL, lplpszAcceptTypes, 
       INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID | 
       INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | INTERNET_FLAG_KEEP_CONNECTION | 
       INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_UI | INTERNET_FLAG_PRAGMA_NOCACHE, 0); 
      if(NULL != hRequest) 
      { 
       const char Params[] = {"u=1234&t=5678"}; 

       BOOL rc = HttpSendRequest(hRequest, NULL, 0, (void*)Params, strlen(Params)); 

       if(rc) // here rc = 0 and GetLastError() returns 12152 
       { 
        DWORD availDataLen; 
        char Buff[4096]; 
        DWORD readCount = ERROR_INTERNET_CONNECTION_RESET; 

        InternetQueryDataAvailable(hInternet, &availDataLen, 0, 0); 
        while(0 < availDataLen) 
        { 
         InternetReadFile(hInternet, Buff, min(sizeof(Buff), availDataLen), &readCount); 
         availDataLen -= readCount; 
         retVal = retVal + Buff; 
        } 
       } 
       InternetCloseHandle(hRequest); 
      } 
      InternetCloseHandle(hConnection); 
     } 
     InternetCloseHandle(hInternet); 
    } 
    return retVal; 
} 

但你可以在代码中看到HttpSendRequest()失败并GetLastError()返回12152

预先感谢您 山姆

回答

4

这是ERROR_WINHTTP_INVALID_SERVER_RESPONSE 。最好猜测你在HTTPS端口上发出HTTP请求。

我不知道该API非常好,但它看起来像你需要INTERNET_FLAG_SECURE添加到您的通话HttpOpenRequest,和/或在您的通话InternetConnect的标志参数太多:

INTERNET_FLAG_SECURE
用途安全事务语义。这转换为使用安全套接字层/专用通信技术(SSL/PCT),并且仅在HTTP请求中有意义。此标志由HttpOpenRequest和InternetOpenUrl使用,但如果https://出现在URL中,则此标志为多余。InternetConnect函数将此标志用于HTTP连接;在此连接下创建的所有请求句柄都将继承此标志。

+0

谢谢你,实际上是这个问题。 – Sam 2011-04-11 16:53:23