2014-09-02 925 views
1

我正在C++上編寫程序,使用WinHTTP向Java Servlet發出調用(POST請求)。當我通過HTTP請求POST時,一切正常,當我通過HTTPS請求時會發生問題。它發送空請求到服務器,但切斷請求主體(但它有內容)如何在C++上使用WinHTTP進行HTTPS調用(POST請求)?

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 - 網址的Servlet(終點),resultBuffer - - 請求體,servletUrl的內容調用結果將被寫入這個緩衝區,outputFile - 日誌文件。

那麼如何在不削減請求正文的情況下創建HTTPS調用?

+0

既然你有Java標記,爲什麼不直接用Java編寫控制檯程序呢? – developerwjk 2014-09-02 20:57:31

+0

@developerwjk,它是用C++編寫的 – 2014-09-03 04:18:16

回答

3

關於WinHttpSendRequest方法中,在第二paramaet刀片:L"content-type:application/x-www-form-urlencoded"和在其上根據W3的第三paramer -1

它應該與此更正一起工作。

此外,檢查你的.php文件的編碼,給我一次麻煩。