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