2010-09-24 20 views
5

J'envoie une requête WinHttp avec des données POST à ​​un script php sur un serveur IIS7 et le corps POST n'est pas reçu par le serveur. Si j'envoie via WinHttp en utilisant GET, ou POST avec un corps NULL, ou via un formulaire HTML en utilisant POST avec un corps, tout fonctionne comme prévu.Corps POST WinHttp non reçu

est ici un code simple montrant la différence entre par WinHttp POST appels avec et sans corps:

Sans un corps:

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); 

Avec un corps:

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); 

Ainsi, le seules les différences sont les paramètres du corps et l'en-tête content-type. La chose vraiment étrange est que cela peut fonctionner 1 fois sur 20, mais généralement le corps n'est pas reçu par le serveur et il expire. Quelque chose ne va pas ici?

Répondre

2

Pour toute autre personne qui a encore ce problème, essayez d'utiliser PUT au lieu de POST.

Dans mon cas, le client WinHttp était en VFP, mais les résultats étaient les mêmes. Un POST envoyé via un navigateur a bien fonctionné, mais lorsque j'ai envoyé à partir de l'objet WinHttp, le corps de la requête est apparu vide.

PUT, cependant, a travaillé normalement ... sauf que

// 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); 

Encore une fois, cela n'a pas été un problème dans les demandes basées sur un navigateur.

En outre, le POST a très bien fonctionné pour un client ASP.NET. Cela n'est apparu qu'en essayant de le lire sur une page PHP/Linux.