2011-01-08 42 views
32

Cuando voy a buscar datos de una URL con una respuesta 403HttpURLConnection leer el contenido de la respuesta de error 403

is = conn.getInputStream(); 

Se lanza una IOException y no puede obtener los datos de respuesta.

Pero cuando se utiliza Firefox y acceder a esa URL directamente, El ResponseCode sigue siendo 403, pero se puede obtener el contenido HTML

Respuesta

53

El método HttpURLConnection.getErrorStream devolverá un InputStream que se puede utilizar para recuperar datos de las condiciones de error (como un 404), según los javadocs.

+3

No, no lo hará, ya que el código de la función contiene solo 'return null;' línea. (Java 6,7) – Gangnus

+2

@Gangnus Lea el Javadoc detenidamente: "Si la conexión no estaba conectada, o si el servidor no tuvo un error al conectarse o si el servidor tenía un error pero no se enviaron datos de error, este método return null. Este es el valor predeterminado. " De lo contrario (errores 4xx), obtendrá la secuencia desde la cual leer. –

+0

@MiljenMikic La diferencia entre el código y Javadoc significa solo que el último es erróneo. – Gangnus

10

intentar algo como esto:

try { 
    String text = "url"; 
    URL url = new URL(text); 
    URLConnection conn = url.openConnection(); 
    // fake request coming from browser 
    conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB;  rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)"); 
    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 
    String f = in.readLine(); 
    in.close(); 
    System.out.println(f); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
+0

¡Esto funcionó como un encanto! –

16

Ejemplo de uso de HttpURLConnection:

String response = null; 
try { 
    URL url = new URL("http://google.com/pagedoesnotexist"); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

    // Hack to force HttpURLConnection to run the request 
    // Otherwise getErrorStream always returns null 
    connection.getResponseCode(); 
    InputStream stream = connection.getErrorStream(); 
    if (stream == null) { 
     stream = connection.getInputStream(); 
    } 
    // This is a try with resources, Java 7+ only 
    // If you use Java 6 or less, use a finally block instead 
    try (Scanner scanner = new Scanner(stream)) { 
     scanner.useDelimiter("\\Z"); 
     response = scanner.next(); 
    } 
} catch (MalformedURLException e) { 
    // Replace this with your exception handling 
    e.printStackTrace(); 
} catch (IOException e) { 
    // Replace this with your exception handling 
    e.printStackTrace(); 
} 
+0

Pensé que tenía que ser '(código> = 200) && (código <300)' – slf

+0

@slf Tienes razón. De hecho, depende de la implementación y la única forma "oficial" es comprobar si 'getErrorStream' devuelve nulo, pero eso solo funciona después de forzar la ejecución de la solicitud. Actualizo mi código para reflejar esto. – qwertzguy

0

Recibí el mismo error incluso después de agregar una cadena de agente. Finalmente, después de un día, la investigación descubrió el problema. En realidad, si el esquema de URL comienza con "HTTPS", se genera el error 403. Debe estar en minúscula ("https"). Así que asegúrese de llamar a "url.toLowercase()" antes de abrir la conexión

Cuestiones relacionadas