使用HttpOpenRequest和HttpSendRequest发送名称/值对

时间:2010-09-02 08:01:01

标签: c++ winapi httpwebrequest

我正在使用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();

1 个答案:

答案 0 :(得分:0)

正如@Luke所说,答案是使用my other question

中详述的代码将数据放入正文中