Android HttpsURLConnection接收不到資料
阿新 • • 發佈:2018-11-12
公司專案通訊用的是Afinal框架,Afinal通訊模組是對HttpClient的封裝,HttpClient非常強大,但靈活性不夠,近段時間比較清閒,於是將專案的通訊實現改為HttpsURLConnection。
想了解HttpClient和HttpURLConnection的可參考
http://blog.csdn.net/hguang_zjh/article/details/33743249
http://www.cnblogs.com/devinzhang/archive/2012/01/17/2325092.html
但是在改造的過程中,遇到一個非常奇葩的問題。
公司專案有兩套後臺環境,姑且稱為A和B。A是通過區域網訪問,基於http協議,B基於https協議通過Internet訪問Apache HTTP再轉接到A,可以認為A和B為同一套環境,他們的區別僅在於客戶端一個是需要連線區域網,一個需要連線外網,並且外網的是用https協議(A是測試環境,B是模擬上線的環境)。在測試環境下,一切皆正常,但是在模擬上線環境上,當某個登入賬號被另一臺裝置登入後,再次傳送通訊,一直無法返回資料。客戶端的異常為
11-10 21:12:14.940: W/System.err(10348): java.net.ProtocolException: content-length promised 182 bytes, but received 0 11-10 21:12:14.950: W/System.err(10348): at com.android.okhttp.internal.http.RetryableOutputStream.close(RetryableOutputStream.java:52) 11-10 21:12:14.950: W/System.err(10348): at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:636) 11-10 21:12:14.950: W/System.err(10348): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:347) 11-10 21:12:14.950: W/System.err(10348): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 11-10 21:12:14.950: W/System.err(10348): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getHeaderField(HttpURLConnectionImpl.java:143) 11-10 21:12:14.950: W/System.err(10348): at java.net.URLConnection.getContentType(URLConnection.java:326) 11-10 21:12:14.950: W/System.err(10348): at java.net.URLConnection.getContent(URLConnection.java:193) 11-10 21:12:14.950: W/System.err(10348): at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getContent(HttpsURLConnectionImpl.java:169)
讓後臺看了下被擠下去時,資料是如何返回的,結果發現一般資料是通過Spring框架返回的,而當賬號被其它裝置登入時,返回的資料是由JSP返回。反反覆覆的將客戶端的程式碼看了幾遍,試了各種請求頭,還是不行。讓IOS客戶端截取了返回的資料,但卻不是182 bytes。很是苦惱,擱了一天,第二天早上,靈光一閃,列印了上送資料的長度,發現正好是182,於是將urlConn.setRequestProperty("Content-Length",jsonBytes.length + "");這句注掉,發現就可以了,查了很多資料,仍不知為什麼,希望有大神能解答。