2012-10-13 8 views
6

Al usar un URLConnection, la redirección 301 no funciona, ni siquiera muestra un encabezado Location, usando getHeaderFields(). Es una lista en blanco, excepto en Android más nuevo (Probé 4.1 y funcionó). Parece que esto también se ha informado en el navegador predeterminado here, aunque en mi prueba funcionó en el navegador Android. ¿Hay alguna solución para este error en Android anterior?301/302 Redirigir no funciona en Android (funciona de manera diferente en versiones diferentes)

me trataron:

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

pero todavía devuelve una lista vacía, excepto en Android más reciente.

Actualización: Puede ser un problema relacionado, a veces parece que URLConnection ni siquiera está enviando una solicitud en algunos casos. (Lo comprobé con Wireshark en una pc con emulador). ¿Hay alguna forma de solucionar este error?

Actualización: Intenté probar la redirección 3xx, los redireccionamientos funcionaban bien, pero los enlaces normales no funcionaban con Ian's Cookie Manager. Después de asegurarse que los setCookies fue llamado inmediatamente después de openConnection, funciona muy bien:

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

Lo realmente extraño es, de nuevo Android (4.1 emulador) la línea followRedirect (comentó "Obligatorio") no es necesario. En Android anterior (2.2), da error Connection Reset by Peer. Esta fue probablemente la razón por la cual mi código experimental de redireccionamiento estaba fallando en 2.2, no en 4.1. ¿Alguna razón para las diferencias en la funcionalidad? De acuerdo con comments here, la redirección https aparentemente tiene un comportamiento diferente dependiendo de la versión de JVM, ¿podría ser que la URLConnection/HTTPUrlConnection de Android también ha cambiado en diferentes versiones?

+0

Usted dicha solicitud HTTP a veces no llega al servidor, ¿cuál es el código de respuesta HTTP 'conn.getResponseCode();' cuando la redirección no ocurre? – yorkw

+0

El método getResponseCode() no está definido para el tipo URLConnection – NoBugs

+1

Usando 'HttpURLConnection.getResponseCode();' cuando se trata de un problema relacionado con http, siempre obtengo y verifico el código de respuesta real antes de hacer algo más. – yorkw

Respuesta

Cuestiones relacionadas