2013-08-25 6 views
0

Я пытаюсь отправить запрос POST скрипту PHP. У меня есть GET для работы, но у меня есть некоторые проблемы с POST. Результат всегда пуст, когда он должен показывать значение параметра 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

Retagged. Я проверил журналы сервера. Кажется, все в порядке. [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 [] =" ... "' и вычтите его из размера запроса. Или используйте 'strlen()', хотя это кажется несколько бессмысленным, так как оно всегда будет одинаковой длины. – WhozCraig

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

  • Нет связанных вопросов^_^