2016-02-21 45 views
1

我對多個站點的HTTP響應代碼(2xx,3xx,4xx & 5xx)感興趣。獲取代碼名爲1的http響應代碼的最佳方法

我目前的代碼在codename one模擬器中工作良好。但作爲Android上的應用程序,某些網站的代碼會引發EOFExceptions。在這些情況下,我沒有收到回覆代碼。

我該如何解決這個問題?在代碼名1中獲得所有這些http返回碼的最佳和推薦的方法是什麼?

for (final Host h : current_hosts) { 

    ConnectionRequest cr = new ConnectionRequest() { 


     protected void readResponse(InputStream input) { 

      h.setHost_return_code(getResponseCode()); 

      try { 
       String response = Util.readToString(input); 
       input.close(); 
      } catch (IOException err) { 
       // do nothing 
      } 

     } 
    }; 
    cr.setUrl(h.getHost_url()); 
    cr.setHttpMethod("HEAD"); 
    cr.setFollowRedirects(false); 
    cr.setReadResponseForErrors(true); 
    cr.setPost(false); 
    cr.setFailSilently(false); 
    cr.setSilentRetryCount(2); 
    cr.setTimeout(15000); 

    NetworkManager.getInstance().addToQueueAndWait(cr); 

} 

DDMS堆棧跟蹤:

02-22 17:04:19.463: W/System.err(29698): java.io.EOFException 
02-22 17:04:19.463: W/System.err(29698): at java.util.zip.GZIPInputStream.readFully(GZIPInputStream.java:202) 
02-22 17:04:19.463: W/System.err(29698): at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:98) 
02-22 17:04:19.463: W/System.err(29698): at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81) 
02-22 17:04:19.473: W/System.err(29698): at com.android.okhttp.internal.http.HttpEngine.initContentStream(HttpEngine.java:468) 
02-22 17:04:19.473: W/System.err(29698): at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:666) 
02-22 17:04:19.473: W/System.err(29698): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:347) 
02-22 17:04:19.473: W/System.err(29698): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 
02-22 17:04:19.473: W/System.err(29698): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503) 
02-22 17:04:19.473: W/System.err(29698): at com.codename1.impl.android.AndroidImplementation.getResponseCode(AndroidImplementation.java:3947) 
02-22 17:04:19.473: W/System.err(29698): at com.codename1.io.ConnectionRequest.performOperation(ConnectionRequest.java:367) 
02-22 17:04:19.473: W/System.err(29698): at com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:269) 
02-22 17:04:19.473: W/System.err(29698): at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60) 
02-22 17:04:19.473: W/System.err(29698): at java.lang.Thread.run(Thread.java:841) 
+0

'EOFException'似乎只在發送'HEAD'請求時出現。當使用'GET'請求時,我得到正確的響應代碼。我寧願使用'HEAD'請求,因爲我只是在HTTP響應代碼中感興趣,並且不需要HTTP正文數據。 – ryru

+0

你可以用電纜連接你的設備,並從android SDK啓動DDMS工具。然後將「EOFException」的堆棧跟蹤添加到問題中? –

+0

謝謝你,你走了。我對移動編程比較陌生,希望我能正確理解您的請求。 – ryru

回答

0

這是因爲這個已知的Android的bug:Android's HttpURLConnection throws EOFException on HEAD requests

我們將添加到解決辦法的一個代號這樣的事情應該「只是工作」。

+0

謝謝謝。您是否可以在應用變通方法時告訴我們,以便我可以將此答案標記爲正確? 對於問題的第二部分,您是否同意讀取http響應代碼的推薦方式在帶有'setReadResponseForErrors(true)'的'readResponse'內? – ryru

+0

現在應該起來,新的版本應該包括修復。 readResponseForErrors意味着即使有錯誤代碼,我們也會調用readResponse。我不確定這是否對'頭部'請求有很大意義,但如果它適合你,那麼它應該沒問題。 –

+0

謝謝你的快速幫助,現在看起來工作得很好。因爲我的用例只是http響應代碼,只需要請求一個「HEAD」消息就很有意義。 – ryru

1

你有沒有在移動互聯網連接? 主機是否可以通過移動設備訪問?

+0

謝謝tizbn。是的,我確實有一個活躍的互聯網連接,並且有問題的網站也可以訪問。 – ryru

相關問題