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)");
Sergio del Amo
quelle
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);
RealHowTo
quelle
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.

mmm
quelle
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)

Brian Agnew
quelle
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");
ZZ Coder
quelle
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.

BullyWiiPlaza
quelle