2013-04-02 21 views
10

sto usando HttpURLConnection per recuperare un URL proprio così:Android HttpURLConnection: maneggiare HTTP redirect

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

Ora voglio scoprire se ci fosse un reindirizzamento e se fosse un permanente (301) o temporaneo (302) per aggiornare l'URL nel database nel primo caso ma non nel secondo.

È possibile mentre si sta ancora utilizzando la gestione dei reindirizzamenti di HttpURLConnection e se, come?

+2

Interessante domanda. Non penso che ci sia un modo standard per gestirlo. Dovrai impostare instanceFollowRedirects su false e gestire manualmente il codice di risposta. – Perception

risposta

9

Basta chiamare getUrl() su URLConnection esempio dopo aver chiamato 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(); 

Se avete bisogno di sapere se il reindirizzamento successo prima ottenere effettivamente il suo contenuto, ecco il codice di esempio:

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

Con il primo esempio di codice, esiste un modo per distinguere tra un reindirizzamento temporaneo e uno permanente? E il tuo secondo esempio lascia a me la gestione del reindirizzamento che vorrei evitare. – Julian

+0

Probabilmente esiste un modo per ottenere tutti i reindirizzamenti temporanei, ma non sono sicuro su come procedere. – syb0rg

+0

Reindirizzamenti temporanei e reindirizzamenti permanenti devono avere codici di risposta diversi. 301 = permanente. 302 e talvolta 307 sono temporanei. – 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; 
} 
Problemi correlati