HttpURLConnectionは応答全体を読み取りません
-
27-09-2019 - |
質問
HTTPPOSTを実行するためにHttpURLConnectionを使用していますが、常に完全な応答が返されるとは限りません。問題をデバッグしたかったのですが、各行をステップスルーすると機能しました。タイミングの問題だと思ったので、Thread.sleepを追加して、コードを実際に機能させましたが、これは一時的な回避策にすぎません。なぜこれが起こっているのか、そしてどのように解決するのか疑問に思います。これが私のコードです: ジェネラコディセタグプレ
後で入力ストリームを読み取るために次のことを行います ジェネラコディセタグプレ
次のHTTPヘッダーを生成します ジェネラコディセタグプレ
他の投稿では、を使用してキープアライブをオフにすることが提案されました。 ジェネラコディセタグプレ
システムプロパティ、試してみたところ、ヘッダーが次のように変更されました ジェネラコディセタグプレ
接続ヘッダーは「閉じる」ですが、それでも応答全体を読み取ることができません。何が間違っているのでしょうか?
解決
あなたの問題はこの行にあると思います: ジェネラコディセタグプレ
javadocによると、available
はブロックせず、すべてのデータが利用可能になるまで待機しないため、最初のパケットを取得するとfalseが返される可能性があります。InputStreamから読み取る適切な方法は、次のとおりです。
ジェネラコディセタグプレ
読み取りは、入力ストリームに何も残っていないか、接続が閉じられている場合に-1を返し、その間、ネットワークをブロックして待機します。配列の読み取りも、単一バイトを使用するよりもはるかにパフォーマンスが高くなります。
他のヒント
見逃したかもしれませんが、コードの「入力」のデータ型は何ですか?一般にInputStreamsについて奇妙なことは、read(...)メソッドがデータが利用可能になるまでブロックし、その後そのデータのみを返す傾向があることです。実際には、EOFExceptionを明示的に強制するまで、InputStreamから読み取り、ByteArrayInputStreamまたはその他の構造に追加し続ける必要があります。
メッセージ全体を一度に読んでいる場合は、isr.available()を予想されるコンテンツの長さと比較できます。これが私がやった方法です: ジェネラコディセタグプレ