2011-01-08 11 views
32

Wenn ich holen Daten aus einer URL mit einer 403 AntwortHttpURLConnection Leseantwortinhalt auf 403 Fehler

is = conn.getInputStream(); 

Es hat eine IOException wirft und ich kann die Antwortdaten nicht erhalten.

Aber wenn ich firefox benutzen und diese URL direkt zugreifen, die Response ist immer noch 403, aber ich kann den HTML-Inhalt

Antwort

53

Die HttpURLConnection.getErrorStream Methode eine InputStream erhalten wird zurückkehren, die verwendet werden können Daten von Fehlerbedingungen abgerufen werden (wie ein 404), nach den Javadocs.

+3

Nein, es wird nicht, denn der Code der Funktion enthält nur "null zurückgeben;" Linie. (Java 6,7) – Gangnus

+2

@Gangnus Lesen Sie den Javadoc sorgfältig: "Wenn die Verbindung nicht hergestellt wurde oder wenn der Server beim Verbindungsaufbau keinen Fehler hatte oder wenn der Server einen Fehler hatte, aber keine Fehlerdaten gesendet wurden, wird diese Methode verwendet null zurückgeben. Dies ist die Standardeinstellung. " Andernfalls (Fehler 4xx) erhalten Sie den Stream zum Lesen. –

+0

@MiljenMikic Der Unterschied zwischen Code und Javadoc bedeutet nur, dass der letzte falsch ist. – Gangnus

10

versuchen, etwas wie folgt aus:

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

Das funktionierte wie ein Zauber! –

16

Anwendungsbeispiel von 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

Ich dachte es müsste '(code> = 200) && (code <300)' – slf

+0

@slf sein Du hast Recht. Es hängt tatsächlich von der Implementierung ab und der einzige "offizielle" Weg besteht darin, zu überprüfen, ob "getErrorStream" null zurückgibt, aber das funktioniert nur, nachdem die Anforderung erzwungen wurde. Ich aktualisiere meinen Code, um dies zu berücksichtigen. – qwertzguy

0

Ich habe denselben Fehler auch nach dem Hinzufügen der Agentenzeichenfolge erhalten. Endlich, nach einer eintägigen Untersuchung, wurde das Problem gelöst. Wenn das URL-Schema mit "HTTPS" beginnt, führt dies zu einem Fehler 403. Es sollte in Kleinbuchstaben ("https") sein. So stellen Sie sicher, dass Sie "url.toLowercase()" aufrufen, bevor Sie die Verbindung öffnen