InternetReadFile 返回损坏的响应

Posted

技术标签:

【中文标题】InternetReadFile 返回损坏的响应【英文标题】:InternetReadFile returns corrupted response 【发布时间】:2009-12-09 06:43:32 【问题描述】:

我正在做一个 GET(REST) 并使用 InternetReadFile API 来读取一个 xml 的响应,当响应很小但当响应大于 10kb 时它工作正常 InternetReadFile 返回的数据之间带有垃圾字符或者它砍了一些部分数据。当我由于垃圾字符的存在或由于缺少某些部分而尝试重建响应时,生成的 xml 将被损坏。

如果我使用 fiddler 进行相同的 GET 调用,那么我会得到正确的响应。

这里是代码sn-p

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 请求 = 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));
        
    

我做错了什么?

谢谢 吉乐

【问题讨论】:

【参考方案1】:

服务器可能在其回复中使用chunked transfer encoding。您必须自己解析它(这并不难)。

编辑: 我最初错过了它,但您的代码有一个错误:您试图将接收到的内容解释为以空字符结尾的字符串,但事实并非如此。

response.append(szBuff);

需要改成

response.append(szBuff, szBuff + bytesRead);

【讨论】:

感谢 atzz,您说得对,服务器正在使用分块传输编码。感谢您突出显示错误:) 今天这对我很有帮助!以某种方式修复了一些复制粘贴的代码!由于某种原因,它只附加了一个“\n0”。

以上是关于InternetReadFile 返回损坏的响应的主要内容,如果未能解决你的问题,请参考以下文章

InternetReadFile 在末尾返回带有额外字符的文本

InternetReadFile() 读取数据但返回 false 并将读取的字节数设置为零

InternetReadFile 填充缓冲区,但返回读取的零字节

异步使用 InternetReadFile() 的正确方法

InternetReadFile() 似乎没有读取互联网数据

InternetReadFile 问题(错误 87 - 参数不正确)