2010-09-24 3 views
5

Я отправляю запрос WinHttp с данными POST в php-скрипт на сервере IIS7, а тело POST не принимается сервером. Если я отправляю через WinHttp с помощью GET или POST с NULL-телом или через HTML-форму, используя POST с телом, все работает так, как ожидалось.WinHttp POST body не получен

Вот некоторые простой код, показывающий разницу между помощью 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); 

Так только разница - это параметры тела и заголовок типа содержимого. На самом деле странно, что это может работать 1 из 20 раз, но обычно тело не получает сервер, и это время истекает. Что-то здесь явно не так?

ответ

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.

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

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