我正在做一个GET(REST)并使用InternetReadFile API来读取xml的响应,当响应很小但是当响应超过10kb时,InternetReadFile会返回带有垃圾字符的数据,或者它会切断一些部分数据。当我尝试重建由于垃圾字符的存在而导致的响应时,或由于缺少某些部分而导致的xml将会损坏。
如果我使用fiddler进行相同的GET调用,那么我会得到正确的响应。
以下是代码段
m_internetsession = InternetOpen("RestToolkit",INTERNET_OPEN_TYPE_PRECONFIG ,NULL,NULL,0);
if(m_internetsession == NULL)
{
throw new exception ("InternetOpen call failed");
}
m_connection = InternetConnect(m_internetsession,m_uri.Gethost().c_str(),(INTERNET_PORT)m_uri.Getport(),"", "", INTERNET_SERVICE_HTTP, 0, 0);
HINTERNET request = HttpOpenRequest(m_connection,m_method.c_str(),m_uri.Getrelativepath()。c_str(),NULL,NULL,NULL,0,0);
阅读回复:
#define HTTP_BUFFER_LENGTH 1024
if(response.empty())
{
CHAR szBuff[HTTP_BUFFER_LENGTH+1];
memset(szBuff,0x00,sizeof(szBuff));
DWORD bytesRead;
while (InternetReadFile(request,szBuff, HTTP_BUFFER_LENGTH,&bytesRead) == TRUE && bytesRead > 0)
{
response.append(szBuff);
memset(szBuff,0x00,sizeof(szBuff));
}
}
我做错了什么?
由于 JeeL
答案 0 :(得分:1)
服务器可能在其回复中使用chunked transfer encoding。你必须自己解析它(这根本不难)。
修改强>: 我最初错过了它,但你的代码有一个错误:你试图将收到的内容解释为以空字符结尾的字符串,但事实并非如此。
response.append(szBuff);
需要更改为
response.append(szBuff, szBuff + bytesRead);