2012-08-22 17 views
11

我的目標是使用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; 
    } 
} 
+0

相關提示:我想原因_why_就是了RetryableOutputStream在所有是因爲有上配置的基本認證保護REST服務器和Android的HttpURLConnectionImpl似乎在獲得401未授權答案時自動重試請求。 –

回答

12

無賴!解決方案是不要從客戶端代碼中調用setChunkedStreamingMode()(或甚至setFixedStreamingMode())! 「-1」是fixedLength和chunkedLength的內部默認值,不能設置爲客戶端,因爲設置值小於或等於「0」會使其缺省爲HttpEngine.DEFAULT_CHUNK_LENGTH(或在固定流模式下拋出異常)。