2010-10-14 46 views
2

我正在發出一個http GET請求。它在我嘗試中的約70%中起作用。出於某種原因,我有時從成功的連接中得不到響應字符串。我只是在我的應用程序中設置了一個按鈕,它不斷激活下面的代碼。一個電話可能無法回覆字符串,下一個電話工作正常:URLConnection有時會返回空字符串響應?

private onButtonClick() { 
    try { 
     doit(); 
    } catch (Exception ex) { 
     ... 
    } 
} 

public void doit() throws Exception { 
    URL url = new URL("http://www.example.com/service"); 

    HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
    connection.setDoInput(true); 
    connection.setUseCaches(false); 
    connection.setAllowUserInteraction(false); 
    connection.setReadTimeout(30 * 1000); 
    connection.setRequestProperty("Connection", "Keep-Alive"); 
    connection.setRequestProperty("Authorization", 
     "Basic " + Base64.encode("username" + ":" + "password")); 

    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

    String line = ""; 
    StringBuilder sb = new StringBuilder(); 
    while ((line = in.readLine()) != null) { 
     sb.append(line); 
    } 
    in.close(); 

    connection.disconnect(); 

    // Every so often this prints an empty string! 
    System.out.println(sb.toString()); 
} 

我在這裏做錯了什麼?這似乎也許我沒有正確地關閉最後一次調用的連接,並且響應被破壞或者什麼?我也()從多個線程同時調用DOIT,但我認爲該法的內容是線程安全的,同樣的行爲雖然

感謝

感謝

回答

2

這個方法看起來很好。它是可重入的,所以呼叫不應互相干擾。這可能是一個服務器問題,無論是故意限制還是隻是一個錯誤。

編輯:你可以用getResponseCode檢查狀態碼。

+0

檢查來自服務器的HTTP狀態(一般爲200,如果好)。 – seand 2010-10-14 06:00:58

+0

如何使用上述設置從服務器檢查狀態碼,但URLConnection是否允許您這樣做? – user291701 2010-10-14 06:13:45

+0

確定讀取了響應代碼,當響應爲空時,代碼爲-1!在嘗試工作時,它會按預期返回200。 – user291701 2010-10-14 06:23:37

0

對於檢查ResponseCode:

 BufferedReader responseStream; 
     if (((HttpURLConnection) connection).getResponseCode() == 200) { 
      responseStream = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); 
     } else { 
      responseStream = new BufferedReader(new InputStreamReader(((HttpURLConnection) connection).getErrorStream(), "UTF-8")); 
     } 

對於空內容resposneCode是204所以如果u能得到空的身體只是多加一個「如果」有204碼。

1

我們也遇到過類似的情況,我遇到了這個問題的以下解決方案: - 在URLConnection對象上設置用戶代理字符串。

URLConnection conn = url.openConnection(); 
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)"); 

more details