我的目標是使用HttpsURLConnection
從Android 4.0開始的REST Web服務。這工作正常,除非我嘗試POST
的東西。這是相關的代碼段:如何顯式禁用Android中的HTTP連接的分塊流模式?
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
的類型,從機器人會源代碼挖掘我認爲如果一個請求需要重試(無論出於何種原因),它會觸發上述例外情況,因爲它會使用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;
}
}
相關提示:我想原因_why_就是了RetryableOutputStream在所有是因爲有上配置的基本認證保護REST服務器和Android的HttpURLConnectionImpl似乎在獲得401未授權答案時自動重試請求。 –