2010-09-24 59 views
5

我發送一個WinHttp請求POST數據到IIS7服務器上的PHP腳本,並且POST正文沒有被服務器接收。如果我使用GET發送WinHttp,或使用NULL主體發送POST,或者使用POST使用主體發送HTML表單,一切都按預期工作。WinHttp POST正文沒有收到

這裏的展示間通過WINHTTP POST有和沒有身體要求的差別一些簡單的代碼:

沒有身體:

HINTERNET hSession = WinHttpOpen(L"WinHTTP/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);//WINHTTP_FLAG_ASYNC); 
HINTERNET mConnection = WinHttpConnect(hSession, L"127.0.0.1", 80, 0); 
HINTERNET hRequest = WinHttpOpenRequest(mConnection, L"POST", L"/test.php", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); 
void* bodyData = NULL; 
DWORD bodyLength = 0; 
bResult = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, bodyData, bodyLength, bodyLength, 0); 

與身體:

HINTERNET hSession = WinHttpOpen(L"WinHTTP/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);//WINHTTP_FLAG_ASYNC); 
HINTERNET mConnection = WinHttpConnect(hSession, L"127.0.0.1", 80, 0); 
HINTERNET hRequest = WinHttpOpenRequest(mConnection, L"POST", L"/test.php", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); 
char* pBodyStr = "a=1&b=2"; 
void* bodyData = (void*) pBodyStr; 
DWORD bodyLength = strlen(pBodyStr); 
bResult = WinHttpSendRequest(hRequest, L"content-type:application/x-www-form-urlencoded", -1, bodyData, bodyLength, bodyLength, 0); 

所以只有身體參數和內容類型標題不同。真奇怪的是,這可能會在20次中有1次,但通常服務器並未收到正文,並且超時。這裏有什麼明顯的錯誤?

回答

2

對於其他人誰還有這個問題,請嘗試使用PUT,而不是POST

就我而言,WinHttp客戶端在VFP中,但結果是一樣的。通過瀏覽器發送的POST工作正常,但是當我從WinHttp對象發送時,請求正文顯示爲空。

PUT,但是,通常工作......除了

// Simply using 
// 
// file_get_contents('php://input') 
//  
// does not work with the request sent by WinHttp.WinHttpRequest. 
$fp = fopen('php://input', 'rb'); 
stream_filter_append($fp, 'dechunk', STREAM_FILTER_READ); 
$report_contents = stream_get_contents($fp); 

再次,這是不是在基於瀏覽器的請求的問題。

另外,POST對ASP.NET客戶端來說工作得很好。這隻有在嘗試在PHP/Linux頁面上閱讀時纔會出現。