WinHttp POST тело не получено - PullRequest
       32

WinHttp POST тело не получено

5 голосов
/ 25 сентября 2010

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

Вот простой код, показывающий разницу между вызовами POST WinHttp с телом и без него:

без тела:

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 раз, но обычно тело не получает сервер и время ожидания истекает. Что-то явно не так здесь?

1 Ответ

2 голосов
/ 27 августа 2012

Для всех, у кого все еще есть эта проблема, попробуйте использовать 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.

...