【问题标题】:Android HttpURLConnection: Handle HTTP redirectsAndroid HttpURLConnection:处理 HTTP 重定向
【发布时间】:2013-04-02 01:25:09
【问题描述】:

我正在使用HttpURLConnection 来检索这样的 URL:

URL url = new URL(address);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setInstanceFollowRedirects(true);
// ...

我现在想知道是否存在重定向以及它是永久 (301) 还是临时 (302) 重定向,以便在第一种情况下更新数据库中的 URL,而在第二种情况下不更新。

在仍然使用HttpURLConnection 的重定向处理时这是否可能?如果,如何?

【问题讨论】:

  • 有趣的问题。我认为没有任何标准的方法来处理这个问题。您必须将 instanceFollowRedirects 设置为 false 并手动处理响应代码。

标签: java android http redirect httpurlconnection


【解决方案1】:

在调用getInputStream() 之后,只需在URLConnection 实例上调用getUrl()

URLConnection con = new URL(url).openConnection();
System.out.println("Orignal URL: " + con.getURL());
con.connect();
System.out.println("Connected URL: " + con.getURL());
InputStream is = con.getInputStream();
System.out.println("Redirected URL: " + con.getURL());
is.close();

如果您需要在实际获取内容之前知道重定向是否发生,这里是示例代码:

HttpURLConnection con = (HttpURLConnection) (new URL(url).openConnection());
con.setInstanceFollowRedirects(false);
con.connect();
int responseCode = con.getResponseCode();
System.out.println(responseCode);
String location = con.getHeaderField("Location");
System.out.println(location);

【讨论】:

  • 对于您的第一个代码示例,有什么方法可以区分临时重定向和永久重定向吗?您的第二个示例将实际的重定向处理留给我,我想避免。
  • 可能有一种方法可以获取所有临时重定向,但我不知道该怎么做。
  • 临时重定向和永久重定向应该有不同的响应代码。 301 = 永久。 302 有时 307 是临时的。
  • 获取内容后如何知道重定向是否发生在哪里?有什么办法吗?
【解决方案2】:
private HttpURLConnection openConnection(String url) throws IOException {
    HttpURLConnection connection;
    boolean redirected;
    do {
        connection = (HttpURLConnection) new URL(url).openConnection();
        int code = connection.getResponseCode();
        redirected = code == HTTP_MOVED_PERM || code == HTTP_MOVED_TEMP || code == HTTP_SEE_OTHER;
        if (redirected) {
            url = connection.getHeaderField("Location");
            connection.disconnect();
        }
    } while (redirected);
    return connection;
}

【讨论】:

  • 我建议给循环增加一个最大值
  • 同意你的意见。
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 2015-06-10
  • 2017-06-12
  • 2018-07-15
  • 2019-08-26
  • 2014-12-02
  • 2010-12-25
相关资源
最近更新 更多