2013-09-20 6 views
5

Я хочу отправить запрос HTTPS GET с помощью WinInet. Насколько я знаю, я должен сделать это так же, как отправить HTTP-запрос, за исключением того, что мне нужно использовать INTERNET_DEFAULT_HTTPS_PORT и INTERNET_FLAG_SECURE флаг.Как отправить запрос HTTPS с помощью WinInet?

Так вот что я пробовал:

#include "stdafx.h" 
#include <string> 
#include <windows.h> 
#include <WinInet.h> 

#pragma comment (lib, "Wininet.lib") 

using namespace std; 


// convert string 
wstring CharPToWstring(const char* _charP) 
{ 
    return wstring(_charP, _charP + strlen(_charP)); 
} 

// send https request 
wstring SendHTTPSRequest_GET(const wstring& _server, 
          const wstring& _page, 
          const wstring& _params = L"") 
{ 
    char szData[1024]; 

    // initialize WinInet 
    HINTERNET hInternet = ::InternetOpen(TEXT("WinInet Test"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); 
    if (hInternet != NULL) 
    { 
     // open HTTP session 
     HINTERNET hConnect = ::InternetConnect(hInternet, _server.c_str(), INTERNET_DEFAULT_HTTPS_PORT, NULL,NULL, INTERNET_SERVICE_HTTP, INTERNET_FLAG_SECURE, 1); 
     if (hConnect != NULL) 
     { 
      wstring request = _page + 
        (_params.empty() ? L"" : (L"?" + _params)); 

      // open request 
      HINTERNET hRequest = ::HttpOpenRequest(hConnect, L"GET", (LPCWSTR)request.c_str() ,NULL, NULL, 0, INTERNET_FLAG_KEEP_CONNECTION, 1); 
      if (hRequest != NULL) 
      { 
       // send request 
       BOOL isSend = ::HttpSendRequest(hRequest, NULL, 0, NULL, 0); 

       if (isSend) 
       { 
        for(;;) 
        { 
         // reading data 
         DWORD dwByteRead; 
         BOOL isRead = ::InternetReadFile(hRequest, szData, sizeof(szData) - 1, &dwByteRead); 

         // break cycle if error or end 
         if (isRead == FALSE || dwByteRead == 0) 
          break; 

         // saving result 
         szData[dwByteRead] = 0; 
        } 
       } 

       // close request 
       ::InternetCloseHandle(hRequest); 
      } 
      // close session 
      ::InternetCloseHandle(hConnect); 
     } 
     // close WinInet 
     ::InternetCloseHandle(hInternet); 
    } 

    wstring answer = CharPToWstring(szData); 

    return answer; 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    wstring answer = SendHTTPSRequest_GET(L"www.site.com", L"page.php", L"param1=value1&param2=value2&param3=value3&param4=value4"); 

    return 0; 
} 

И моя функция возвратила ответ:

<html> 

<head><title>400 The plain HTTP request was sent to HTTPS port</title></head> 

<body bgcolor="white"> 

<center><h1>400 Bad Request</h1></center> 

<center>The plain HTTP request was sent to HTTPS port</center> 

<hr><center>nginx/1.0.10</center> 

</body> 

</html> 

Что я делаю неправильно?

ответ

5

INTERNET_FLAG_SECURE следует использовать в флагах для HttpOpenRequest, а не InternetConnect. Внимательно прочитайте документы.

Смежные вопросы