我通过https从服务器获取一些数据。问题是,当我尝试运行此代码时,它只写空字符串(response.toString()
返回空)。但是当我在Thread.sleep
行之前添加BufferedReader
方法时,它只是完美运行(从服务器返回完整数据)。这里的主要问题是什么?
private static void httpGet(String urlStr, String[] paramName, String[] paramVal) throws Exception {
URL url = new URL(urlStr);
HttpsURLConnection conn
= (HttpsURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setAllowUserInteraction(false);
conn.setRequestProperty(COOKIE_HEADER, param);
if (conn != null) {
//Thread.sleep(1000);
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
System.out.println(response.toString());
}
}
答案 0 :(得分:0)
好吧,你的代码对我有用;-)甚至没有Thread.sleep - 见下文 - 我从“Oracle”中提取数据。另外请不要忘记关闭输入流。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
public class URLConnectionReader {
public static void main(String[] args) throws Exception {
URL url = new URL("https://www.oracle.com");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setAllowUserInteraction(false);
//conn.setRequestProperty("COOKIE_HEADER", param);
if (conn != null) {
// Thread.sleep(1000);
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
System.out.println(response.toString());
}
}
}
答案 1 :(得分:0)
GET请求时
HttpsUrlConnection
获取EOF异常
您没有执行GET请求。您正在进行POST,但您没有提供任何POST数据。
这里还有很多其他问题:
conn.setRequestMethod("GET");
这是默认值。不要写无意义的代码。
conn.setDoOutput(true);
这会将请求方法更改为POST。如果您不想进行POST,请删除此行。
conn.setDoInput(true);
这是默认值。不要写无意义的代码。
if (conn != null) {
此时 conn
不可能为null。不要写无意义的代码。
//Thread.sleep(1000);
网络代码中的睡眠实际上是浪费时间。不要使用它们,也不要认为它们可以解决网络问题。他们没有。他们可能掩盖他们一点,但潜在的问题仍然存在。
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
在这里,您尝试从POST中读取响应,而无需编写任何POST数据。服务器可能会成为对象,可能是通过提前终止连接,这可能会导致EOFException
,但不会导致上面的readLine()
代码。由于您没有提供堆栈跟踪,因此无法进一步发表评论。但是,除非存在服务器端问题,否则您的代码应该在修复上述错误后工作。