Comment vérifier si une URL existe ou renvoie 404 avec 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");
}

ça devrait être écrit

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

sortie

200

200

200

404

SOLUTION

Ajouter la ligne suivante avant .connect () et la sortie serait 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)");
67
demandé sur Sergio del Amo 2009-09-04 13:38:50

5 réponses

vous pouvez ajouter

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

si vous ne voulez pas suivre la redirection (3xx)

au lieu de faire un" GET", une" HEAD " est tout ce dont vous avez besoin.

huc.setRequestMethod("HEAD");
return (huc.getResponseCode() == HttpURLConnection.HTTP_OK);
54
répondu RealHowTo 2009-09-04 11:14:06

cela a fonctionné pour moi:

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

merci pour les suggestions ci-dessus.

38
répondu mmm 2011-04-21 18:37:42

utilisez HttpUrlConnection en appelant openConnection() sur votre objet URL.

getResponseCode () vous donnera la réponse HTTP une fois que vous aurez lu depuis la connexion.

p.ex.

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

(non testé)

23
répondu Brian Agnew 2014-06-10 16:15:44

il n'y a rien de mal avec votre code. C'est la NBC.com je te fais des tours. Quand NBC.com décide que votre navigateur N'est pas capable d'afficher PDF, il renvoie simplement une page Web indépendamment de ce que vous demandez, même si elle n'existe pas.

vous avez besoin de le piéger en arrière en lui disant que votre navigateur est capable, quelque chose comme,

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");
12
répondu ZZ Coder 2009-09-04 10:40:36

D'après les réponses données et les informations dans la question, c'est le code que vous devez utiliser:

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

bien sûr testé et opérationnel.

4
répondu BullyWiiPlaza 2017-07-11 14:03:40