未收到 WinHttp POST 正文

Posted

技术标签:

【中文标题】未收到 WinHttp POST 正文【英文标题】:WinHttp POST body not received 【发布时间】:2011-04-17 00:46:00 【问题描述】:

我正在向 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);

所以唯一的区别是正文参数和内容类型标头。真正奇怪的是,这可能会工作 20 次中的 1 次,但通常服务器不会接收到正文并且它会超时。这里有什么明显的问题吗?

【问题讨论】:

【参考方案1】:

对于仍有此问题的其他人,请尝试使用 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 页面上尝试阅读时才会出现这种情况。

【讨论】:

以上是关于未收到 WinHttp POST 正文的主要内容,如果未能解决你的问题,请参考以下文章

wininet 或 winhttp,这是 POST 请求的首选

任何人都知道为啥这个带有 WinHttp 的 POST 失败了

如何使用带有“传输编码:分块”的 winhttp api

收到请求时使用 morgan 记录 POST 正文大小

CURL Post 不起作用(未发送正文)

正文未在“获取”POST请求和(我的)解决方案中发送[重复]