Java 中的非重定向 HttpURLConnection 请求没有答案

no answers from a non-redirectional HttpURLConnection request in Java

这是我尝试做的一个最小示例:

public static String fetch () {

    // get a connection to the website
    HttpURLConnection connection = (HttpURLConnection)(new URL("http://example.com?param=ok").openConnection());

    // configure the connection
    connection.setRequestMethod("GET");
    connection.setInstanceFollowRedirects(false);


    connection.setUseCaches(false);
    connection.setDoInput(true);
    connection.setDoOutput(true);

    // send the request
    DataOutputStream ostream = new DataOutputStream(connection.getOutputStream());
    ostream.flush();
    ostream.close();


    // receives the response
    InputStream istream = connection.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(istream));
    StringBuffer response = new StringBuffer();

    String line;
    while ((line = reader.readLine()) != null) {
        response.append(line);
        response.append('\r');
    }
    reader.close();

    return response.toString();
}

要到达“http://example.com”,服务器首先发送一个重定向,HttpURLConnection自动使用这个重定向,然后显示最后一个死胡同页面的响应。 我想获取此中间响应的字节码。 为此,我尝试使用方法 setInstanceFollowRedirects 并设置为 false(参见代码)。它似乎可以工作,因为不再有输出,但这就是我 post 在这里的原因,因为不再有输出 fuuuu

有人知道为什么当我尝试输出 return response.toString(); 时什么都不显示吗?

很清楚为什么您没有收到响应字符串。您已禁用自动跟随重定向。所以你可能会得到一个只包含 header 的响应,没有 body。您的响应字符串正在收集 body 的字节,并且由于响应中没有 body 仅表示 "go to another location" 您的字符串为空。

您应该执行 connection.getResponseCode 并阅读 Location header 以了解下一步要去哪里。然后您可以使用这个新位置创建另一个请求,您将获得 "real" 响应。

我不知道 "the byte code of intermediary response" 到底是什么意思。我想您对 header 值感兴趣。你可以用 connection.getHeaderFields() 得到所有的 header。您迭代此地图并收集所有有趣的 header 值以供进一步处理。