2016-07-06 33 views
0

我將我們的HTTP庫從Apache轉換到我公司的Android應用程序中的OkHttp3。java.net.ProtocolException:意外的狀態行:{} HTTP/1.1 422不可處理的實體

的okHttp客戶端設置以下方式:

mDefaultClient = new OkHttpClient.Builder() 
       .readTimeout(getSocketTimeOut(), TimeUnit.MILLISECONDS) 
       .writeTimeout(getSocketTimeOut(), TimeUnit.MILLISECONDS) 
       .connectTimeout(getSocketTimeOut(), TimeUnit.MILLISECONDS) 
       .followRedirects(true) 
       .connectionPool(new ConnectionPool(MAX_TOTAL_CONNECTION, 5, TimeUnit.MINUTES)) 
       .addNetworkInterceptor(new StethoInterceptor()) 
       .followSslRedirects(true) 
       .build(); 

當連接設置爲保持活動(默認設置),一些請求失敗,出現以下Java異常:

java.net.ProtocolException: Unexpected status line: {}HTTP/1.1 422 Unprocessable Entity 

java.net.ProtocolException: Unexpected status line: {}HTTP/1.1 200 OK 

這些請求總是失敗,出現此異常,如果該請求恰好在它返回304未修改響應與一個空的正文。

沒有這304響應,這些請求被成功處理。

我已經閱讀無處不在,解決方案是將連接關閉標頭添加到請求。

但是,我不想這樣做。我們想要使用的連接池幾乎是無用的。

保持連接正常運行對我們來說是一種好處,我們希望保持與OkHttp相同的優勢。

服務器似乎沒有發送錯誤響應,通過發送郵遞員請求到服務器進行驗證,這不會失敗。另外,我們以前的Apache客戶端正確處理了這些請求。

添加攔截器(網絡或其他)似乎不起作用。我嘗試填充正文或爲304請求設置'Content-Length'爲0,但下一個請求總是失敗。

我有什麼選擇?

+0

然後,前面的304響應格式不正確,或者您的庫不正確地處理它。你有蹤跡嗎? –

回答

0

您的網絡服務器不正確地返回HTTP 304響應的響應數據。讓他們來解決這個問題。

在等待時,您可以使用OkHttp network interceptor解決方案,該解決方案將Connection: close標頭添加到所有HTTP 304的響應標頭中。

相關問題