繁体   English   中英

HttpsUrlConnection在GET请求时获取EOF异常

[英]HttpsUrlConnection getting EOF exception while GET request

我通过https从服务器获取一些数据。 问题是,当我尝试运行此代码时,它只写空字符串( response.toString()返回空)。 但是当我在BufferedReader行之前添加Thread.sleep方法时,它只是完美运行(从服务器返回完整数据)。 这里的主要问题是什么?

   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());
    }
   }

好吧,你的代码对我有用;-)甚至没有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());
    }
}

}

HttpsUrlConnection在GET请求时获取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()代码中。 由于您没有提供堆栈跟踪,因此无法进一步发表评论。 但是,除非存在服务器端问题,否则在修复上述错误后,您的代码应该可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM