2010-09-02 42 views
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(); 
+0

到底是不是有什麼工作給你詳細的代碼? HttpSendRequest的第一組參數是標題,第二組參數是body;你通過你的有效載荷作爲身體。我認爲這是大型有效載荷的常用操作方法。 – Luke 2010-09-02 11:53:48

+0

目標是期望數據在form/path?data = xyzzy中,但是大的xyzzy值似乎正在碰到ERROR_INSUFFICIENT_BUFFER。在嘗試更改目標前我正在尋找一種方法 – 2010-09-02 12:50:01

+1

您的意思是在請求URI中?例如「GET/path?data = xyzzy HTTP/1.1 \ r \ n」?對於大數據來說這是不可能的,至少不使用WinINet。 ntcolonel在你的其他問題中的答案是要走的路。由於數據將在正文中發送,而不是標題,因此您必須更改目標。 – Luke 2010-09-02 15:25:55

回答