2014-09-02 4 views
1

Я пишу программу на C++ для совершения вызовов (POST-запросов) на Java-сервлеты с использованием WinHTTP. Когда я запрашиваю POST через HTTP, все в порядке, проблема возникает, когда я запрашиваю через HTTPS. Он посылает пустые запросы на сервер, но отсекает тело запроса (но он имеет содержание)Как сделать HTTPS-вызовы (запросы POST) с помощью WinHTTP на C++?

int sendPostRequest(char *pszPostData, LPCTSTR servletUrl, char* resultBuffer, ofstream &outputFile) { 

    outputFile << "====================================== SENDING REEQUEST ======================================" << endl; 

    HINTERNET hSession = WinHttpOpen(
     userAgent, 
     WINHTTP_ACCESS_TYPE_NO_PROXY, 
     WINHTTP_NO_PROXY_NAME, 
     WINHTTP_NO_PROXY_BYPASS, 
     0); 
    if (!hSession) 
    { 
     _tprintf(_TEXT("Failed to open WinHTTP session: %ld\n"), GetLastError()); 
     outputFile << "Failed to open WinHTTP session: %ld\n" << GetLastError() << endl; 
     return NULL; 
    } 
    else { 
     _tprintf(_TEXT("Oppening WinHTTP session successful: %ld\n"), GetLastError()); 
     outputFile << "Oppening WinHTTP session successful: %ld\n" << GetLastError() << endl; 
    } 

    HINTERNET hConnect = WinHttpConnect(
     hSession, 
     serverIP, 
     serverPort, 
     0); 
    if (!hConnect) 
    { 
     _tprintf(_TEXT("Failed to connect to server: %ld\n"), GetLastError()); 
     outputFile << "Failed to connect to server: %ld\n" << GetLastError() << endl; 
     WinHttpCloseHandle(hSession); 
     return NULL; 
    } 
    else { 
     _tprintf(_TEXT("Connection to server successful: %ld\n"), GetLastError()); 
     outputFile << "Connection to server successful: %ld\n" << GetLastError() << endl; 
    } 

    _tprintf(_TEXT("Post data : %ld\n"), pszPostData); 
    outputFile << "Post data : %ld\n" << pszPostData << endl; 
    DWORD dwDataLen = strlen(pszPostData); 

    HINTERNET hRequest = WinHttpOpenRequest(
     hConnect, 
     _TEXT("POST"), 
     servletUrl, 
     NULL, 
     WINHTTP_NO_REFERER, 
     WINHTTP_DEFAULT_ACCEPT_TYPES, 
     WINHTTP_FLAG_REFRESH); 
    if (!hRequest) 
    { 
     _tprintf(_TEXT("Failed to open request: %ld\n"), GetLastError()); 
     outputFile << "Failed to open request: %ld\n" << GetLastError() << endl; 
     WinHttpCloseHandle(hConnect); 
     WinHttpCloseHandle(hSession); 
     return -1; 
    } 
    else { 
     _tprintf(_TEXT("Opening request successful: %ld\n"), GetLastError()); 
     outputFile << "Opening request successful: %ld\n" << GetLastError() << endl; 
    } 

    DWORD dwReqOpts = 0; 
    DWORD dwSize = sizeof(DWORD); 
    WinHttpSetOption(
     hRequest, 
     WINHTTP_OPTION_SECURITY_FLAGS, 
     &dwReqOpts, 
     sizeof(DWORD)); 

    BOOL done = false; 
    BOOL rc = WinHttpSendRequest(
     hRequest, 
     contentTypeHeader, 
     -1, 
     (LPVOID)pszPostData, 
     dwDataLen, 
     dwDataLen, 
     NULL); 

    if (rc) { 
     rc = WinHttpReceiveResponse(hRequest, NULL); 
     _tprintf(_TEXT("Sending request successful: %ld\n"), GetLastError()); 
     outputFile << "Sending request successful: %ld\n" << GetLastError() << endl; 
    } 
    else 
    { 
     _tprintf(_TEXT("Send request failed: %ld\n"), GetLastError()); 
     outputFile << "Send request failed: %ld\n" << GetLastError() << endl; 
     WinHttpCloseHandle(hRequest); 
     WinHttpCloseHandle(hConnect); 
     WinHttpCloseHandle(hSession); 
     return -1; 
    } 

    // Get the status from the server 
    DWORD dwCode = 0; 
    if (rc) 
    { 
     rc = WinHttpQueryHeaders(
      hRequest, 
      WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, 
      NULL, 
      &dwCode, 
      &dwSize, 
      NULL); 
    } 

    if (dwCode != HTTP_STATUS_OK) 
    { 
     _tprintf(_TEXT("HTTP Request failed: %ld\n"), dwCode); 
     outputFile << "HTTP Request failed: %ld\n" << dwCode << endl; 
     WinHttpCloseHandle(hRequest); 
     WinHttpCloseHandle(hConnect); 
     WinHttpCloseHandle(hSession); 
    } 
    else 
    { 
     _tprintf(_TEXT("HTTP Request is ok: %ld\n"), dwCode); 
     outputFile << "HTTP Request is ok : %ld\n" << dwCode << endl; 

     // Keep reading from the remote server until there's nothing left to read 
     DWORD dwBytesToBeRead = 0, dwBytesRead = 0; 
     //char szBuffer[8192] = { 0 }; 
     //strcpy(resultBuffer, ""); 
     do 
     { 
      if (!WinHttpQueryDataAvailable(hRequest, &dwBytesToBeRead)) 
      { 
       _tprintf(_TEXT("No data available from server? %ld"), GetLastError()); 
       outputFile << "No data available from server? %ld" << GetLastError() << endl; 

       WinHttpCloseHandle(hRequest); 
       WinHttpCloseHandle(hConnect); 
       WinHttpCloseHandle(hSession); 
       return -1; 
      } 

      if (!WinHttpReadData(
       hRequest, 

       //szBuffer, 
       resultBuffer, 

       //sizeof(szBuffer), 
       RESULT_BUFFER_SIZE, 

       &dwBytesRead)) 
      { 
       _tprintf(_TEXT("Failed to read data from server: %ld"), GetLastError()); 
       outputFile << "Failed to read data from server: %ld" << GetLastError() << endl; 

       WinHttpCloseHandle(hRequest); 
       WinHttpCloseHandle(hConnect); 
       WinHttpCloseHandle(hSession); 
       return -1; 
      } 
      if (dwBytesRead > 0) 
      { 
       //szBuffer[dwBytesRead] = 0; 
       resultBuffer[dwBytesRead] = 0; // NULL-terminated returned buffer 
      } 
     } while (dwBytesRead > 0); 
     WinHttpCloseHandle(hRequest); 
     WinHttpCloseHandle(hConnect); 
     WinHttpCloseHandle(hSession); 
     return 0; 
    } 
    return -1; 
} 

Где pszPostData - содержание тела запроса, servletUrl - URL для сервлета (конечной точки), resultBuffer - вызов результат будет записан в этот буфер, outputFile - файл для журналов.

Как сделать HTTPS-вызовы без вырезания тела запроса?

+0

С тех пор как вы отметили Java, почему бы просто не написать консольную программу на Java? – developerwjk

+0

@developerwjk, он написан на C++ –

ответ

3

Что касается WinHttpSendRequest метода, на 2-м paramaet вставки: L"content-type:application/x-www-form-urlencoded" и на 3-й paramer -1, который в соответствии с w3.

Он должен работать с этой коррекцией.

Кроме того, проверьте кодировку своего .php-файла, я сразу же столкнулся с проблемой.