java - 如何从http服务器获取重定向url?

标签 java

当我执行 HTTP POST 请求时,即使网页自动重定向,我也会收到 200 作为响应代码,而不是 3xx。我试过this ,但不起作用。我的代码:

HttpURLConnection con = getMultipartHttpURLConnection(
        formParameter.getServerUrl(), boundary);
setRequestHeaders(con);
String urlParameters = getParameter(formParameter.getForm());
// Send post request
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
responseCode = con.getResponseCode();
String header = con.getHeaderField("Location");

编辑:

通过一些研究,我发现如果服务器配置为重定向到启用了 https:// 的网址,那么我将得到 3xx 作为响应代码,否则不会。上面链接中给出的示例具有相同的作用。

最佳答案

这是因为 HttpURLConnection 很智能,可以在内部处理重定向。 200 响应代码是发生重定向的新位置的响应代码。

我知道如何检索重定向 URL 的唯一方法是使用 setFollowRedirects(false) 并手动遵循重定向。

请参阅以下示例:

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class GetRedirectURL {
    public static void main(final String... args) throws IOException {
        final URL url = new URL("http://www.google.com/");
        //HttpURLConnection.setFollowRedirects(false);
        final HttpURLConnection con = (HttpURLConnection) url.openConnection();
        //con.setInstanceFollowRedirects(false);
        final int responseCode = con.getResponseCode();
        final String location = con.getHeaderField("Location");
        System.err.format("%d%n%s%n", responseCode, location);
    }
}

如果您不修改此代码,它将打印 200 null。如果取消注释任何控制重定向行为的行,输出将更改为 `200 http://www.google ...' .

重要的是,在 HttpURLConnection 实例的状态机通过从响应读取的方法调用发送请求之前完成重定向设置的修改。

关于java - 如何从http服务器获取重定向url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27247237/

相关文章:

Java -Xmx 命令没有给我预期的内存

java - 如何修复 "Exception in thread "main"java.lang.NoClassDefFoundError : org/springframework/core/io/support/SpringFactoriesLoader"in Spring Tool Suite

java - JSP 中图像不显示

java - Proguard 保留接口(interface)方法参数名

java - 如何在整数变量后附加十六进制文字数字?

java - 在编写 Junit 测试时,Mockito.mock 比使用 new 有何优势?

java - 作用域中断,它们存在吗?

java - 查询结果不存入POJO?

java - 如何以编程方式从网站下载图像?

java - 如何将 Intent 过滤器添加到 Flex android 项目 list 中?