我正在向IIS7服务器上的php脚本发送带有POST数据的WinHttp请求,并且服务器未收到POST正文。如果我使用GET发送WinHttp,或者使用NULL主体发送POST,或者使用带有正文的POST通过HTML表单发送,则一切都按预期工作。
这里有一些简单的代码,显示了使用和不使用正文的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);
所以唯一的区别是body参数和content-type标头。真正奇怪的是,这可能会在20次中有1次起作用,但通常服务器不接收正文并且它超时。这里有什么明显的错误吗?
答案 0 :(得分: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页面上读取它时才会出现这种情况。