2009-09-04 2 views
64
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 sollteWie überprüft man, ob eine URL existiert oder 404 mit Java zurückgibt?

exists 
does not exists 

TEST

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

Output

404drucken

SOLUTION

die nächste Zeile hinzufügen, bevor .Connect() und der Ausgang 200 sein würde, 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)"); 
+0

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

+0

Tatsächlich scheint ich eine weitgehend leere HTML-Seite zu bekommen –

+1

Diese Website scheint gültigen Inhalt für fast alles zu geben. z.B. www.nbc.com/junk. Versuchen Sie mit http://www.example.com/junk.html –

Antwort

24

Verwenden HttpUrlConnection von openConnection() auf Ihrem 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)

+0

Ich habe meinen Code mit einem fehlgeschlagenen Test aktualisiert –

+2

Funktioniert nicht! –

12

Es ist nichts falsch mit Ihrem Code. Es ist die NBC.com, die Tricks an dir macht. Wenn NBC.com entscheidet, dass Ihr Browser keine PDF-Dateien anzeigen kann, sendet er einfach eine Webseite zurück, unabhängig davon, was Sie anfordern, auch wenn sie nicht existiert.

Sie müssen es zurück zu täuschen, indem es Ihrem Browser sagen, ist in der Lage, so etwas wie,

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

Sie möchten

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

hinzufügen, wenn Sie die Umleitung nicht folgen wollen (3XX)

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

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

+1 für den HEAD, Leute vergessen, wie HTTP hin und wieder funktioniert und es ist gut, einige Leute erinnern sich noch :) –

+0

Der Umgang mit HTTPS-URLs ist schwieriger, nicht wahr ?? Muss die Zertifikate verwalten ... – Jayy

36

dies für mich gearbeitet:

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

Dank für die oben genannten Vorschläge.

1

Basierend auf den Antworten und Informationen in der Frage, das ist 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.