Android HttpURLConnection: обрабатывать перенаправления HTTP

Я использую HttpURLConnection для получения URL-адреса именно так:

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

Теперь я хочу выяснить, было ли перенаправление и если это был постоянный (301) или временный (302) один для обновления URL-адреса в базе данных в первом случае, но не во втором.

Возможно ли это при использовании обработки переадресации HttpURLConnection и если, как?

Ответ 1

Просто вызовите getUrl() в URLConnection экземпляр после вызова getInputStream():

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

Ответ 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;
}