2009-12-09 92 views
1

在做一個GET(REST)和使用的InternetReadFile API來讀取響應它是一個XML,當反應較小,但在響應更多的則是10KB的InternetReadFile,其間垃圾字符返回數據,它工作正常或者它會刪除一部分數據。當我嘗試重新構建由於垃圾字符的存在或由於缺乏某些部分而導致的XML的響應將被破壞時。的InternetReadFile返回損壞的響應

如果我使用招再進行同樣的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請求= 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

回答

1

服務器,大概在答覆使用chunked transfer encoding。你必須自己解析它(這並不難)。

編輯: 我錯過了最初的,但你的代碼中有一個錯誤:你想解釋接收到的內容爲空值終止字符串,它不是。

response.append(szBuff); 

需要atzz,你是正確的服務器使用分塊傳輸編碼改爲

response.append(szBuff, szBuff + bytesRead); 
+0

謝謝。感謝您突出顯示錯誤:) – JeeZ 2009-12-09 12:01:28

+0

不客氣! :) – atzz 2009-12-09 12:31:17