2010-10-14 63 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