¿Cómo verificar si existe una URL o devuelve 404 con Java?

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

Esto debería imprimir

 exists does not exists 

PRUEBA

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

Salida

200
200
200
404

SOLUCIÓN

Agregue la siguiente línea antes de .connect () y la salida sería 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)"); 

Es posible que desee agregar

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

si no quieres seguir la redirección (3XX)

En lugar de hacer un “GET”, una “HEAD” es todo lo que necesita.

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

esto funcionó para mí:

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

gracias por las sugerencias anteriores.

Use HttpUrlConnection llamando a openConnection() en su objeto URL.

getResponseCode () le dará la respuesta HTTP una vez que haya leído de la conexión.

p.ej

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

(no probado)

No hay nada malo con tu código. Es el NBC.com haciendo trucos contigo. Cuando NBC.com decide que su navegador no es capaz de mostrar PDF, simplemente envía de vuelta una página web independientemente de lo que está solicitando, incluso si no existe.

Tienes que engañarlo diciéndole que tu navegador es capaz, algo así como,

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

Basado en las respuestas dadas y la información en la pregunta, este es el código que debe usar:

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

Por supuesto probado y funcionando.