2013-04-02 13 views
10

Używam HttpURLConnection do pobierania adresu URL po prostu tak:Android HttpURLConnection: Stosować przekierowań HTTP

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

Teraz chcę, aby dowiedzieć się, czy nie było przekierowanie i jeśli to było stałe (301) lub tymczasowy (302) jeden w celu aktualizacji adresu URL w bazie danych w pierwszym przypadku, ale nie w drugim.

Czy jest to możliwe, jeśli nadal używasz przekierowania z obsługą HttpURLConnection i czy, jak?

+2

Interesujące pytanie. Nie sądzę, że istnieje jakikolwiek standardowy sposób, aby sobie z tym poradzić. Będziesz musiał ustawić wartość instanceFollowRedirects na wartość false i ręcznie obsłużyć kod odpowiedzi. – Perception

Odpowiedz

9

Wystarczy zadzwonić getUrl() na URLConnection przykład po wywołaniu 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(); 

Jeśli chcesz wiedzieć, czy przekierowania zdarzyło rzeczywiście coraz to zawartość, oto przykładowy kod:

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

W swoim pierwszym przykładzie kodu, czy istnieje sposób na odróżnienie tymczasowego od stałego przekierowania? Twój drugi przykład pozostawia dla mnie faktyczne przekierowanie, którego chciałbym uniknąć. – Julian

+0

Prawdopodobnie istnieje sposób, aby uzyskać wszystkie tymczasowe przekierowania, ale nie jestem pewien, jak to zrobić. – syb0rg

+0

Tymczasowe przekierowania i trwałe przekierowania powinny mieć różne kody odpowiedzi. 301 = Trwale. 302, a czasami 307 są tymczasowe. – Keab42

0
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; 
} 
Powiązane problemy