0
我正在使用HttpOpenRequest發送form/path?data = xyzzy的數據。然而XYZZY可能非常大,有時k的100S,和在某些機器上,HttpOpenRequest還失敗,錯誤122(ERROR_INSUFFICIENT_BUFFER)使用HttpOpenRequest和HttpSendRequest發送名稱/值對
根據Microsoft kb 208427最大URL長度是在Internet Explorer
2083個字符,但它也規定
'但是,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();
到底是不是有什麼工作給你詳細的代碼? HttpSendRequest的第一組參數是標題,第二組參數是body;你通過你的有效載荷作爲身體。我認爲這是大型有效載荷的常用操作方法。 – Luke 2010-09-02 11:53:48
目標是期望數據在form/path?data = xyzzy中,但是大的xyzzy值似乎正在碰到ERROR_INSUFFICIENT_BUFFER。在嘗試更改目標前我正在尋找一種方法 – 2010-09-02 12:50:01
您的意思是在請求URI中?例如「GET/path?data = xyzzy HTTP/1.1 \ r \ n」?對於大數據來說這是不可能的,至少不使用WinINet。 ntcolonel在你的其他問題中的答案是要走的路。由於數據將在正文中發送,而不是標題,因此您必須更改目標。 – Luke 2010-09-02 15:25:55