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

Esto debería imprimir¿Cómo comprobar si existe una URL o devuelve 404 con 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"));   

salida

SOLUCIÓN

Añadir la siguiente línea antes de .Connect() y la salida sería de 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

No veo el problema en su prueba. En mi navegador no obtengo el contenido para el segundo resultado, pero no obtengo un 404 –

+0

De hecho, parece que obtengo una página HTML prácticamente vacía –

+1

Ese sitio web parece dar contenido válido para casi cualquier cosa. p.ej. www.nbc.com/junk. Pruebe con http://www.example.com/junk.html –

Respuesta

24

Uso HttpUrlConnection llamando 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)

+0

Actualicé mi código con una prueba fallida –

+2

¡No funciona! –

12

no hay nada malo con su 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.

Necesitas engañar de nuevo diciéndole que su 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"); 
53

Es posible que desee añadir

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

si no desea seguir redirección (3XX)

En lugar de hacer un "GET", una "CABEZA" es todo lo que necesita.

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

+1 para HEAD, la gente olvida cómo funciona HTTP de vez en cuando y es bueno que algunas personas todavía lo recuerden :) –

+0

Lidiar con las URL de HTTPS es más complicado ¿no? Tengo que administrar los certificados ... – Jayy

36

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.

1

Sobre la base de las respuestas dadas y la información en la pregunta, este es el código que puedes 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 de trabajo.

Cuestiones relacionadas