Wie kann ich überprüfen, ob eine URL vorhanden ist oder 404 mit Java zurückgibt?


75
String urlString = "http://www.nbc.com/Heroes/novels/downloads/Heroes_novel_001.pdf";
URL url = new URL(urlString);
if(/* Url does not return 404 */) {
    System.out.println("exists");
} else {
    System.out.println("does not exists");
}
urlString = "http://www.nbc.com/Heroes/novels/downloads/Heroes_novel_190.pdf";
url = new URL(urlString);
if(/* Url does not return 404 */) {
    System.out.println("exists");
} else {
    System.out.println("does not exists");
}

Dies sollte gedruckt werden

exists
does not exists

PRÜFUNG

public static String URL = "http://www.nbc.com/Heroes/novels/downloads/";

public static int getResponseCode(String urlString) throws MalformedURLException, IOException {
    URL u = new URL(urlString); 
    HttpURLConnection huc =  (HttpURLConnection)  u.openConnection(); 
    huc.setRequestMethod("GET"); 
    huc.connect(); 
    return huc.getResponseCode();
}

System.out.println(getResponseCode(URL + "Heroes_novel_001.pdf")); 
System.out.println(getResponseCode(URL + "Heroes_novel_190.pdf"));   
System.out.println(getResponseCode("http://www.example.com")); 
System.out.println(getResponseCode("http://www.example.com/junk"));           

Ausgabe

200
200
200
404

LÖSUNG

Fügen Sie die nächste Zeile vor .connect () hinzu, und die Ausgabe wäre 200, 404, 200, 404

huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)");

Ich sehe das Problem nicht in Ihrem Test. In meinem Browser bekomme ich keinen Inhalt für das zweite Ergebnis, aber ich bekomme keinen 404
Brian Agnew

Tatsächlich scheine ich eine weitgehend leere HTML-Seite zu bekommen
Brian Agnew

1
Diese Website scheint für fast alles gültige Inhalte zu bieten. zB www.nbc.com/junk. Versuchen Sie es mit example.com/junk.html
Brian Agnew

Die URL nbc.com/Heroes/novels/downloads/Heroes_novel_190.pdf gibt mir eine völlig leere Seite (nicht einmal <html> -Tag), aber mit einem 404-Header. Nicht sehr nett zu den Benutzern, aber technisch korrekt.
Michael Borgwardt

1
Sie hätten die Lösung in eine Antwort aufteilen sollen, damit ich das auch positiv bewerten kann!.
Kingsolmn

Antworten:


59

Vielleicht möchten Sie hinzufügen

HttpURLConnection.setFollowRedirects(false);
// note : or
//        huc.setInstanceFollowRedirects(false)

wenn Sie der Umleitung nicht folgen möchten (3XX)

Anstatt ein "GET" zu machen, ist ein "HEAD" alles, was Sie brauchen.

huc.setRequestMethod("HEAD");
return (huc.getResponseCode() == HttpURLConnection.HTTP_OK);

18
+1 für den KOPF, die Leute vergessen ab und zu, wie HTTP funktioniert, und es ist gut, dass sich einige Leute noch daran erinnern :)
Benjamin Gruenbaum

1
Der Umgang mit HTTPS-URLs ist schwieriger, oder?
Müssen

43

das hat bei mir funktioniert:

URL u = new URL ( "http://www.example.com/");
HttpURLConnection huc =  ( HttpURLConnection )  u.openConnection (); 
huc.setRequestMethod ("GET");  //OR  huc.setRequestMethod ("HEAD"); 
huc.connect () ; 
int code = huc.getResponseCode() ;
System.out.println(code);

danke für die vorschläge oben.


23

Verwenden Sie HttpUrlConnection, indem Sie openConnection()Ihr URL-Objekt aufrufen .

getResponseCode () gibt Ihnen die HTTP-Antwort, sobald Sie von der Verbindung gelesen haben.

z.B

   URL u = new URL("http://www.example.com/"); 
   HttpURLConnection huc = (HttpURLConnection)u.openConnection(); 
   huc.setRequestMethod("GET"); 
   huc.connect() ; 
   OutputStream os = huc.getOutputStream(); 
   int code = huc.getResponseCode(); 

(nicht getestet)


12

An Ihrem Code ist nichts auszusetzen. Es ist die NBC.com, die dir Tricks macht. Wenn NBC.com feststellt, dass Ihr Browser keine PDF-Dateien anzeigen kann, sendet er einfach eine Webseite zurück, unabhängig davon, was Sie anfordern, auch wenn diese nicht vorhanden ist.

Sie müssen es zurücktrickeln, indem Sie ihm mitteilen, dass Ihr Browser in der Lage ist.

conn.setRequestProperty("User-Agent",
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.13) Gecko/2009073021 Firefox/3.0.13");

11

Basierend auf den gegebenen Antworten und Informationen in der Frage ist dies der Code, den Sie verwenden sollten:

public static boolean doesURLExist(URL url) throws IOException
{
    // We want to check the current URL
    HttpURLConnection.setFollowRedirects(false);

    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

    // We don't need to get data
    httpURLConnection.setRequestMethod("HEAD");

    // Some websites don't like programmatic access so pretend to be a browser
    httpURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)");
    int responseCode = httpURLConnection.getResponseCode();

    // We only accept response code 200
    return responseCode == HttpURLConnection.HTTP_OK;
}

Natürlich getestet und funktioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.