我正在发出一个http GET请求。它在大约70%的尝试中起作用。出于某种原因,我有时从成功的连接中得不到响应字符串。我只是在我的应用程序中设置了一个按钮,它继续触发下面的代码。一个调用可能无法用字符串回复,下一个调用可以正常工作:
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(),但我认为该方法的内容是线程安全的,但同样的行为,
由于
由于
答案 0 :(得分:2)
该方法看起来很好。它是可重入的,因此呼叫不应互相干扰。这可能是一个服务器问题,无论是刻意限制还是只是一个错误。
编辑:您可以使用getResponseCode
检查状态代码。
答案 1 :(得分:1)
我们也遇到了类似的情况,我遇到了以下针对此问题的解决方案: - 在URLConnection对象上设置用户代理字符串。
URLConnection conn = url.openConnection();
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)");
答案 2 :(得分: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.所以,如果你可以得到空身,只需再添加一个"如果"用204代码。