我正在使用HttpsURLConnection
从Android 4.0针对一个REST Web服务进行定位。 除非我尝试进行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.HTTPUrlConnection
的实现会忽略流模式为0或更低的设置:
public void setChunkedStreamingMode(int chunkLength) {
[...]
if (chunkLength <= 0) {
this.chunkLength = HttpEngine.DEFAULT_CHUNK_LENGTH;
} else {
this.chunkLength = chunkLength;
}
}