当服务器未返回200OK时,我试图从HttpUrlConnection对象获取响应正文。就我而言,我得到了302重定向,因此使用getInputStream()不起作用。我尝试使用getErrorStream(),但是由于某种原因,这给了我一个空对象。当我期望收到实际响应时,为什么会得到getErrorStream()的空对象?

public static void main(String[] args) {
        String url = "http://www.google.com/";
        String proxy = "proxy.myproxy.com";
        String port = "8080";
        try {
            URL server = new URL(url);
            Properties systemProperties = System.getProperties();
            systemProperties.setProperty("http.proxyHost",proxy);
            systemProperties.setProperty("http.proxyPort",port);
            HttpURLConnection connection = (HttpURLConnection)server.openConnection();
            connection.connect();
            System.out.println("Response code:" + connection.getResponseCode());
            System.out.println("Response message:" + connection.getResponseMessage());
            InputStream test = connection.getErrorStream();
            String result = new BufferedReader(new InputStreamReader(test)).lines().collect(Collectors.joining("\n"));
        } catch (Exception e) {
            System.out.println(e);
            System.out.println("error");
        }
    }


在我的代码中,我看到的输出是:

Response code:302
Response message:Object Moved
java.lang.NullPointerException
error


具体来说,该错误发生在我的try子句的最后一行,因为它是我的getErrorStream()返回空对象,因此我得到了nullPointerException。有人熟悉吗?谢谢

最佳答案

因为302不被视为错误HTTP response code


3XX代码是Redirection responses
4XX代码是Client error responses
5XX代码是Server error responses


由于响应不是以45开头,因此不会将其视为错误的响应。

另请参阅HttpURLConnection::getErrorStream的文档:


  如果连接失败但服务器仍发送有用数据,则返回错误流。典型示例是HTTP服务器响应404时,这将导致在连接中抛出FileNotFoundException,但是服务器发送了HTML帮助页面,其中包含有关操作建议。




也可以随时深入研究source code以获得更多信息,以及在哪里清楚:

@Override
public InputStream getErrorStream() {
    if (connected && responseCode >= 400) {
        // Client Error 4xx and Server Error 5xx
        if (errorStream != null) {
            return errorStream;
        } else if (inputStream != null) {
            return inputStream;
        }
    }
    return null;
}


遗憾的是,该信息未包含在文档中。

关于java - HttpUrlConnection:从非200OK获取响应正文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55976904/

10-11 04:25
查看更多