2012-10-13 19 views
6

Quando si utilizza un URLConnection, il reindirizzamento 301 non funziona, non mostra nemmeno un'intestazione Location, utilizzando getHeaderFields(). È una lista vuota, tranne nel più recente Android (ho testato 4.1 e ha funzionato). Sembra che qualcosa sia stato segnalato nel browser predefinito here, anche se nel mio test ha funzionato nel browser Android. C'è qualche soluzione per questo bug nel vecchio Android?301/302 Reindirizzamento non funzionante in Android (funziona in modo diverso in versioni diverse)

ho provato:

URLConnection conn = u.openConnection(); 
HttpURLConnection conn = (HttpURLConnection) u.openConnection(); 
(conn).setInstanceFollowRedirects(true); 

ma restituisce comunque una lista vuota, tranne che in più recente di Android.

Aggiornamento: Potrebbe trattarsi di un problema correlato, a volte sembra che URLConnection non invii nemmeno una richiesta in alcuni casi. (Ho controllato con Wireshark su un PC con l'emulatore). C'è un modo per aggirare questo bug?

Aggiornamento: Ho provato a eseguire il reindirizzamento 3xx, i reindirizzamenti funzionavano correttamente, ma i collegamenti normali non funzionavano con Cookie Manager di Ian. Dopo aver verificato le setCookies è stato chiamato subito dopo OpenConnection, funziona benissimo:

 URL u = new URL(_url); 
     ... 
     int tries = 4; 
     int code = 301; 
     URLConnection conn = null; 
     while (tries > 0 && code/100 == 3) { 
      conn = null; 
      conn = u.openConnection(); 
      _CM.setCookies(conn); 
      ((HttpURLConnection)conn).setInstanceFollowRedirects(false);//Required 
      code =((HttpURLConnection)conn).getResponseCode(); 
      if (code/100 == 3) { 
       String loc = conn.getHeaderField("Location"); 
       u = new URL(loc); 
      } 
     } 

     //conn.addRequestProperty("Accept-Encoding", "gzip"); 

     conn.connect(); 
     _CM.storeCookies(conn); 

La cosa veramente strana è, per la più recente Android (4.1 emulatore) la linea followRedirect (ha commentato: "Required") non è necessario. Su Android precedente (2.2), dà l'errore Connection Reset by Peer. Questo era probabilmente il motivo per cui il mio codice di reindirizzamento sperimentale stava fallendo in 2.2, non in 4.1. Qualche ragione per le differenze di funzionalità? Secondo lo comments here, il reindirizzamento https apparentemente ha un comportamento diverso a seconda della versione di JVM, potrebbe essere che anche URLConnection/HTTPUrlConnection di Android sia cambiato in diverse versioni?

+0

Lei ha detto richiesta HTTP a volte non raggiunge il server, qual è il codice di risposta HTTP 'conn.getResponseCode();' quando il reindirizzamento non si verifica? – yorkw

+0

Il metodo getResponseCode() non è definito per il tipo URLConnection – NoBugs

+1

utilizzando 'HttpURLConnection.getResponseCode();' quando si ha a che fare con il problema relativo a http, otterrei sempre e controllerò il codice di risposta effettivo prima di fare qualsiasi altra cosa. – yorkw

risposta

Problemi correlati