2013-08-25 53 views
0

我想發送POST請求到PHP腳本。我已經得到工作,但有一些POST問題。當它顯示post參數的值時,結果始終爲空。任何人都知道爲什麼這篇文章與WinHttp失敗

#include <windows.h> 
#include <wininet.h> 

#pragma comment(lib, "Crypt32.lib") 
#pragma comment(lib, "wininet.lib") 

void PrintError(char *szFunc) 
{ 
char szErr[128]; 
wsprintf(szErr, "%s: %d\n", szFunc, GetLastError()); 
OutputDebugString(szErr); 
} 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 
{ 
BOOL bCookie; 
DWORD dwFlags; 
DWORD dwReadSize; 
DWORD dwBuffLen = sizeof(dwFlags); 
HINTERNET hInternet, hSession, hRequest; 
char szBuffer[256 * 1024] = ""; 
SIZE_T nBufferSize = 0; 

hInternet = InternetOpen("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); 
if(hInternet == NULL) 
{ 
    PrintError("InternetOpen"); 
    return 0; 

} 

hSession = InternetConnect(hInternet, "localhost", 443, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL); 
if(hSession == NULL) 
{ 
    PrintError("InternetConnet"); 
    return 0; 
} 

hRequest = HttpOpenRequest(hSession, "GET", "/index.php", "HTTP/1.1", NULL, NULL, INTERNET_FLAG_SECURE|INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_NO_COOKIES, NULL); 
if(hRequest == NULL) 
{ 
    PrintError("HttpOpenRequest"); 
    return 0; 
} 

// Need to do this to support self signed SSL certificates   
InternetQueryOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen); 
dwFlags = INTERNET_FLAG_IGNORE_CERT_CN_INVALID|SECURITY_FLAG_IGNORE_UNKNOWN_CA; 
InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));  

// Set cookie data 
if(!HttpAddRequestHeaders(hRequest, "Cookie: my_cookie=chocolate_chip\r\n", -1L, HTTP_ADDREQ_FLAG_ADD)) 
{     
    PrintError("HttpAddRequestHeaders"); 
    return 0; 
} 

if(!HttpSendRequest(hRequest, NULL, 0, NULL, 0)) 
{ 
    PrintError("HttpSendRequest"); 
    return 0; 
} 

for(;;) 
{ 
    dwReadSize = 0; 
    InternetReadFile(hRequest, szBuffer + nBufferSize, sizeof(szBuffer) - nBufferSize - 1, &dwReadSize); 
    if(!dwReadSize) 
    { 
     break; 
    }      
    szBuffer[nBufferSize + dwReadSize] = 0;      
    nBufferSize += dwReadSize; 
} 

if(strstr(szBuffer, "chocolate_chip")) 
{ 
    bCookie = true; 
    OutputDebugString("Cookie Is Working...\n");    
} 

hRequest = HttpOpenRequest(hSession, "POST", "/index.php", "HTTP/1.1", NULL, NULL, INTERNET_FLAG_SECURE|INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_NO_COOKIES, NULL); 
if(hRequest == NULL) 
{ 
    PrintError("HttpOpenRequest"); 
    return 0; 
} 

// Need to do this to support self signed SSL certificates   
InternetQueryOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen); 
dwFlags = INTERNET_FLAG_IGNORE_CERT_CN_INVALID|SECURITY_FLAG_IGNORE_UNKNOWN_CA; 
InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));  

// Should be at the top, just for debug.. 
char *szPostData = "my_post=HelloWorld!"; 
if(!HttpSendRequest(hRequest, "Content-Type: application/x-www-form-urlencoded", -1, (LPVOID)szPostData, sizeof(szPostData))) 
{ 
    PrintError("HttpOpenRequest"); 
    return 0; 
} 

// Clear the buffer from before 
memset(szBuffer, 0, sizeof(szBuffer)); 

// Maybe there is a better way to read data? 
for(;;) 
{ 
    dwReadSize = 0; 
    InternetReadFile(hRequest, szBuffer + nBufferSize, sizeof(szBuffer) - nBufferSize - 1, &dwReadSize); 
    if(!dwReadSize) 
    { 
     break; 
    }      
    szBuffer[nBufferSize + dwReadSize] = 0;      
    nBufferSize += dwReadSize; 
} 

MessageBox(0, szBuffer, 0, 0); // Always empty for post 

InternetCloseHandle(hRequest); 
InternetCloseHandle(hSession); 
InternetCloseHandle(hInternet); 
return 0; 
} 

我正在使用的PHP代碼,所以你可以看到我在這裏試圖做什麼。

<?php 

if(isset($_COOKIE['my_cookie'])) 
{ 
    echo $_COOKIE['my_cookie']; 
} 

if(isset($_POST['my_post'])) 
{   
     echo $_POST['my_post'];   
} 

?> 

在這裏呆了幾個小時。任何人都知道最新情況?

+0

應該被重新標記爲WinINet。開始查看服務器正在接收的原始主體。 –

+0

重新標記。我檢查了服務器日誌。似乎沒問題。 [26/Aug/2013:10:41:12 +1200]「POST /index.php HTTP/1.1」200 - 「 - 」「Mozilla/5.0(Windows NT 6.1; WOW64; rv:23.0)Gecko/20100101 Firefox /23.0「 $ _POST []似乎沒有被設置。 – SnakeByte

回答

2
char *szPostData = "my_post=HelloWorld!"; 
if(!HttpSendRequest(hRequest, "Content-Type: application/x-www-form-urlencoded", -1, (LPVOID)szPostData, sizeof(szPostData))) 

sizeof(szPostData)不符合您的想法。它計算char*指針的大小(以字節爲單位),而不是它指向的數據。

+0

...和後續。將其更改爲'static const char szPostData [] =「...」'並從請求大小中減去1。或者使用'strlen()',儘管這看起來有些沒有意義,因爲它總是長度相同。 – WhozCraig

相關問題