3

私はこの質問のソースコードを使用しています 非同期で httprequest を実行し、応答のダウンロードの進行状況を 表示して、Web ページの html ソースを取得し、これまでにダウンロードされたデータを含むプログレスバーを表示し、ページの合計サイズを表示します。

その特定のコードは実際には ICS 4.0.3 では機能しません。これは、clHeaders[0] が何も指さず、サーバーの応答から Content-Length ヘッダーが省略されているため、インデックス 0 で ArrayIndexOutOfBounds という例外が発生するためです。それが問題だった場合に備えて getContentLength を使用してみました - 負の値 -1 を返し、すべてのヘッダーを反復処理しましたが、Content-Length はありませんでした。これらのビットを削除した後、コードは正常に動作し、Web ページが取得され、ファイルに書き込まれ、ダウンロード中のサイズが表示されますが、実際にすべてをダウンロードするまでは明らかに最終サイズではありません。

原因については、次の 3 つの考えしかありません。

  1. Content-Length ヘッダーを送信していないため、受信していませんが、これは間違っているように聞こえます。さらに、HttpClient がバックグラウンドで送信していないかどうかはわかりません。
  2. サーバーの応答がストリーミングまたはチャンクされている場合、getContentLength が -1 を返す可能性があるという別の質問をここで読みました。
  3. Gzip? しかし、それを無効にする方法や、そもそも有効になっていたかどうかはわかりません

サーバーが壊れていると思われる場合は、Google を含む多くの Web サイトを試しましたが、Content-Length ヘッダーはまったくありません。

4

2 に答える 2

0

Content-Lengthを応答に含めないか、無視する必要がある場合があります。これらのケースは、W3サイトに文書化されています。たとえば、コンテンツにgzipの転送エンコーディングがある場合、content-lengthは無視する必要があります。

于 2013-03-08T11:45:33.780 に答える
0

Content-Lengthヘッダーはオプションであり、ほとんどの場合、HEADリクエスト、またはコンテンツが大きすぎる場合にクライアントがリクエストを中止することを決定する可能性がある非常に大きなデータにのみ役立ちます。そうです、Content-Lengthダイは常に存在するとは限りません。それ以外は、通常、データを読み取ってコンテンツの長さを取得する必要があります。

于 2013-03-08T10:33:18.030 に答える