我正在使用HttpOpenRequest发送表单/ path?data = xyzzy的数据。然而,xyzzy可能非常大,有时是100的k,并且在某些机器上HttpOpenRequest失败并出现错误122(ERROR_INSUFFICIENT_BUFFER)
根据Microsoft kb 208427,Internet Explorer中的最大URL长度为2,083个字符
但它也说明了
'但是,POST方法不受提交名称/值对的URL大小的限制。这些对在标题中传输,而不是在URL“
中传输回答我的问题,Why might HttpOpenRequest fail with error 122, 和其他几个来源,建议数据应该由HttpSendRequest发送,但是这不会将数据作为标题的一部分发送,并且不会被选为名称/值对。
如何使用名称/值对通过http发送大量数据?
我的代码是
std::string fURL = "/path";
std::string payload = "xml=xmldata";
HINTERNET fSessionHandle = InternetOpenW(L"Agent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET fConnectHandle = InternetConnectW(fSessionHandle, L"172.24.5.42", 8090, NULL, NULL, INTERNET_SERVICE_HTTP, WININET_API_FLAG_SYNC, 0);
HINTERNET fRequestHandle;
LPCSTR types[] = { "application/x-www-form-urlencoded", NULL };
fRequestHandle = HttpOpenRequestA(fConnectHandle, "POST", fURL.c_str(), NULL, NULL, types , INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE, 0);
if (fRequestHandle)
{
if (!HttpSendRequestW(fRequestHandle, NULL, -1, (LPVOID)payload.c_str(), (DWORD)payload.length()))
std::cerr << "HTTP Send Request failed, sys error " << GetLastError();
}
else
std::cerr << "HTTP Open Request failed, sys error " << GetLastError();