2009-09-04 7 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"); 
} 

ten powinien wydrukowaćJak sprawdzić, czy istnieje URL lub zwraca 404 z Java?

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

Wyjście

ROZWIĄZANIE

Dodaj następną linię przed .Podłączyć(), a wyjście będzie 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)"); 
+0

Nie widzę problemu w teście. W mojej przeglądarce nie dostaję treści do drugiego wyniku, ale nie dostaję 404 –

+0

W rzeczywistości wydaje mi się, że otrzymuję w dużej mierze pustą stronę HTML. –

+1

Ta strona wydaje się zawierać ważną treść dla większości wszystkiego. na przykład www.nbc.com/junk. Wypróbuj za pomocą adresu http://www.example.com/junk.html –

Odpowiedz

24

Zastosowanie HttpUrlConnection wywołując openConnection() na obiekcie URL.

getResponseCode() wyświetli odpowiedź HTTP po przeczytaniu połączenia.

np.

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

(nie badane)

+0

Zaktualizowałem swój kod o nieudany test –

+2

Nie działa! –

12

Nie ma nic złego w kodzie. To NBC.com robi sztuczki na ciebie. Kiedy NBC.com zdecyduje, że twoja przeglądarka nie jest w stanie wyświetlać plików PDF, po prostu odsyła stronę bez względu na to, czego żądasz, nawet jeśli nie istnieje.

Trzeba oszukać ją z powrotem mówiąc to przeglądarka jest zdolne, mniej więcej tak,

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

Możesz dodać

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

jeśli nie chcesz śledzić przekierowania (3XX)

Zamiast robić "GET", "GŁOWA" jest wszystkim, czego potrzebujesz.

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

+1 dla HEAD, ludzie zapominają, że HTTP działa od czasu do czasu i dobrze, że niektórzy wciąż pamiętają :) –

+0

Radzenie sobie z adresami URL HTTPS jest trudniejsze? Zarządzaj certyfikatami ... – Jayy

36

ten pracował dla mnie:

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

dzięki za sugestie powyżej.

1

Na podstawie podanych odpowiedzi i informacji w pytaniu, jest to kod, który trzeba zastosować:

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

Oczywiście przetestowany i działa.