Как явно отключить режим потоковой передачи для HTTP-соединений в Android?
Я нацеливаюсь на веб-службу REST с Android 4.0, используя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, я понял, что если запрос нужно повторить (по какой-либо причине), он высовывается с вышеприведенным исключением, потому что выясняет, что этоnot используяRetryableOutputStream
что он хочет там.
Теперь возникает вопрос: как заставить мой HttpsURLConnection возвращать такой RetryableOutputStream, или, скорее, как правильно предотвратить кодирование фрагментированных запросов? яthought Я сделал это уже сsetChunkedStreamingMode(0)
, но, видимо, это не тот случай ...
[edit]
Нет, реализацияjava.net.HTTPUrlConnection
игнорирует потоковый режим 0 или ниже:
public void setChunkedStreamingMode(int chunkLength) {
[...]
if (chunkLength <= 0) {
this.chunkLength = HttpEngine.DEFAULT_CHUNK_LENGTH;
} else {
this.chunkLength = chunkLength;
}
}