为什么HttpOpenRequest会因错误122而失败?

时间:2010-07-29 13:32:30

标签: c++ winapi httpwebrequest

以下代码

fRequestHandle = HttpOpenRequestA(
                   fConnectHandle, 
                   "POST", url.c_str(), 
                   NULL, NULL, NULL,
                   INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE, 
                   0); 

返回NULL,GetLastError()返回122.搜索表明此错误是

122 (ERROR_INSUFFICIENT_BUFFER) The data area passed to a system call is too small. 

但没有说明缓冲区可能太小。

这可能涉及哪个缓冲区,以及如何让它更大?

更新

正如已经指出的那样,在http://support.microsoft.com/kb/208427,Internet Explorer以及大概是wininet库的详细信息,其网址限制为2083个字符。

然而,看着我的网址,我发现网址本身大约是 40个字符。 650k的数据是名称/值对,wininet没有限制

3 个答案:

答案 0 :(得分:2)

通常,您的网址大小应为2k或更小。由于您正在执行POST,因此您正朝着正确的方向前进,它只是针对您的大部分数据,您希望将其作为HTTP请求的主体传递,如下例所示:

POST /login.jsp HTTP/1.1
Host: www.mysite.com
User-Agent: Mozilla/4.0
Content-Length: 27
Content-Type: application/x-www-form-urlencoded

userid=joe&password=guessme <--You need to do this!

来自这里:http://developers.sun.com/mobility/midp/ttips/HTTPPost/

以下是我想你想做的事情:

std::string url("http://host.com/url");

std::string dataPayload("name=value&othername=anothervalue");//Query string payload style.
DWORD dataPayloadLength = dataPayload.length();

std::ostringstream headerStream;
headerStream << "content-length: ";
headerStream << dataPayloadLength;
std::string headers = headerStream.str();

DWORD headerLength = headers.length();

HINTERNET handle = HttpOpenRequest(hConnect,
    "POST",
    url.c_str(), 
    NULL, NULL, NULL,
    INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE, 
    0);

if(!handle) {
    DWORD errorCode = GetLastError();
    //Handle error here.
}

//Use this thing to send POST values.
if(! HttpSendRequest(handle,
    headers.c_str(),
    headerLength,
    dataPayload, //lpOptional <--Your POST data...not really optional for you.
    dataPayloadLength) {

    DWORD errorCode = GetLastError();
    //Handle error here.
}

答案 1 :(得分:1)

答案 2 :(得分:1)

经过一些挖掘后,当AV或防火墙阻止我的GET请求时,我收到错误122。