Android HttpURLConnection: обработка перенаправлений HTTP

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

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

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

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


person Julian    schedule 02.04.2013    source источник
comment
Интересный вопрос. Я не думаю, что есть какой-то стандартный способ справиться с этим. Вам нужно будет установить для instanceFollowRedirects значение false и вручную обработать код ответа.   -  person Perception    schedule 02.04.2013


Ответы (2)


Просто вызовите 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);
person syb0rg    schedule 02.04.2013
comment
В вашем первом примере кода есть ли способ различить временную и постоянную переадресацию? И ваш второй пример оставляет фактическую обработку перенаправления мне, чего я хотел бы избежать. - person Julian; 03.04.2013
comment
Вероятно, есть способ получить все временные перенаправления, но я не уверен, как это сделать. - person syb0rg; 04.04.2013
comment
Временные перенаправления и постоянные перенаправления должны иметь разные коды ответа. 301 = Постоянный. 302, а иногда и 307 являются временными. - person Keab42; 23.05.2014
comment
Как узнать, где произошло перенаправление после получения его содержимого? Там в любом случае? - person Shajeel Afzal; 08.11.2016

person    schedule
comment
Я бы предложил добавить максимум в цикл - person ; 05.05.2018
comment
Согласен с вами. - person danik; 07.05.2018