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