2

GET(REST) を実行し、InternetReadFile API を使用して xml である応答を読み取ります。応答が小さい場合は正常に動作しますが、応答が 10kb を超える場合、InternetReadFile は間にジャンク文字を含むデータを返すか、データの一部を切り刻みます。 . ジャンク文字が存在するため、または一部が不足しているために応答を再構築しようとすると、結果の xml が破損します。

フィドラーを使用して同じ 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));
        }
    }

私は何を間違っていますか?

ありがとう

4

1 に答える 1

2

おそらく、サーバーはその応答でチャンク転送エンコーディングを使用します。自分で解析する必要があります (これはまったく難しくありません)。

編集: 最初は見逃していましたが、コードにエラーがあります: 受信したコンテンツを null で終わる文字列として解釈しようとしていますが、そうではありません。

response.append(szBuff);

に変更する必要があります

response.append(szBuff, szBuff + bytesRead);
于 2009-12-09T07:33:12.200 に答える