11

を使用してAndroid4.0のRESTWebサービスをターゲットにしていHttpsURLConnectionます。POST私が何かをしようとしない限り、これはうまくいきます。これは関連するコードセクションです:

   connection.setDoOutput(true);
   connection.setChunkedStreamingMode(0);

   ByteArrayOutputStream out = new ByteArrayOutputStream();
   serializeObjectToStream(out, object);
   byte[] array = out.toByteArray();
   connection.getOutputStream().write(array, 0, array.length);

これにより、次の例外がスローされます。

   java.net.HttpRetryException: Cannot retry streamed HTTP body

デバッグから、私が経由する出力ストリームconnection.getOuputStream()はタイプChunkedOutputStreamであり、Androidのソースコードを掘り下げることから、リクエストを再試行する必要がある場合(何らかの理由で)、上記の例外を除いて突くことがわかりました。そこに欲しいものを使っていません。RetryableOutputStream

問題は次のとおりです。HttpsURLConnectionがそのようなRetryableOutputStreamを返すようにするにはどうすればよいですか。むしろ、チャンクされた要求のエンコードを適切に防ぐにはどうすればよいですか。私はすでにそれをやったと思っsetChunkedStreamingMode(0)ていましたが、どうやらそうではありません...

[編集]

いいえ、の実装はjava.net.HTTPUrlConnection0以下のストリーミングモードを無視します。

 public void setChunkedStreamingMode(int chunkLength) {
    [...]
    if (chunkLength <= 0) {
        this.chunkLength = HttpEngine.DEFAULT_CHUNK_LENGTH;
    } else {
        this.chunkLength = chunkLength;
    }
}
4

2 に答える 2

12

バマー!解決策は、クライアントコードからまったく呼び出さないsetChunkedStreamingMode()(または呼び出さない)ことです。setFixedStreamingMode()「-1」はfixedLengthとchunkedLengthの内部デフォルト値であり、クライアント側で設定することはできません。「0」以下の値を設定すると、デフォルトでデフォルトになりますHttpEngine.DEFAULT_CHUNK_LENGTH(または、固定ストリーミングモードの場合は例外がスローされます)。

于 2012-08-27T12:12:40.623 に答える
1

解決策は、Content-Lengthヘッダー(この次の部分で設定される可能性があります)を設定し、setFixedLengthStreamingMode送信するPOSTメッセージの適切な長さで呼び出すことです。

このSOFAQの「ストリーミングモード」セクションを参照してください。

java.net.URLConnectionを使用してHTTPリクエストを起動および処理する

于 2012-08-29T23:52:04.700 に答える