Як перевірити, чи існує URL-адреса чи повертає 404 з Java?


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

Це має надрукувати

exists
does not exists

ТЕСТ

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

Вихідні дані

200
200
200
404

РІШЕННЯ

Додайте наступний рядок перед .connect (), і результат буде 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)");

Я не бачу проблеми у вашому тесті. У своєму браузері я не отримую вміст для другого результату, але не отримую і 404
Брайан Егню

Насправді, здається, я отримую майже порожню HTML-сторінку
Брайан Егню

1
Цей веб-сайт, здається, дає дійсний вміст для майже будь-чого. наприклад, www.nbc.com/junk. Спробуйте з example.com/junk.html
Брайан Егню

URL-адреса nbc.com/Heroes/novels/downloads/Heroes_novel_190.pdf дає мені абсолютно порожню сторінку (навіть не тег <html>), але з заголовком 404. Не дуже приємно для користувачів, але технічно правильно.
Майкл Борґвардт,

1
Вам слід було розділити рішення на відповідь, щоб я міг також проголосувати !.
Kingsolmn,

Відповіді:


59

Можливо, ви захочете додати

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

якщо ви не хочете слідувати за перенаправленням (3XX)

Замість того, щоб робити "ОТРИМАТИ", "ГОЛОВА" - це все, що вам потрібно.

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

18
+1 за ГОЛОВУ, люди забувають, як HTTP працює час від часу, і добре, що деякі люди все ще пам’ятають :)
Бенджамін Груенбаум,

1
Робота з URL-адресами HTTPS є складнішою, чи не так?
Доводиться

43

це спрацювало для мене:

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

дякую за наведені вище пропозиції.


23

Використовуйте HttpUrlConnection , викликаючи openConnection()ваш об’єкт URL.

getResponseCode () надасть вам відповідь HTTP після прочитання з підключення.

напр

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

(не перевірено)


12

З вашим кодом немає нічого поганого. Це NBC.com робить трюки з вами. Коли NBC.com вирішує, що ваш браузер не може відображати PDF, він просто надсилає назад веб-сторінку незалежно від того, що ви вимагаєте, навіть якщо вона не існує.

Вам потрібно обдурити це, сказавши, що ваш браузер здатний, щось на зразок,

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

Виходячи з поданих відповідей та інформації у питанні, ось такий код слід використовувати:

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

Звичайно перевірено і працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.