Newsgroup: it.comp.java
Titolo: Determinare esistenza di un URL!

Ciao, volevo fare un semplicissimo programmino che, dando in input degli 
URL, mi riesca a dire se sono riferiti ad indirizzi esistenti o meno.
La mia idea é quella di connettersi al sito stesso e ritornare qualche 
parametro, ad esempio il titolo, ma non so se é la piů giusta.
Le mie domande sono:
- quali librerie mi devo studiare x la connessione a pagine web? Mi pare di 
aver sentito parlare di URLConnection o qualcosa del genere?
- qualcuno ha idee migliori x poter fare la cosa di cui sopra?
Grazie a tutti x le risposte! 

 
Ciao, mi permetto due osservazioni:
1. trovo abbastanza inutile  farti ritornare il titolo della pagina. Non 
ti basta il codice di risposta del webserver ?
2. per la connession non ti bastano le java-socket? La rete è piena di 
esempi
-- 
Mess
http://www.mibmagazine.it

 URL, mi riesca a dire se sono riferiti ad indirizzi esistenti o meno.
Cioe' se ricevi da un DNS come risposta un IP ?
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

"Andrea Tarducci" ha scritto nel messaggio

Puoi usare sicuramente URLConnection:
URL url = new URL ("...blabla....");
URLConnection urlConn = url.openConnection ();
InputStream is = urlConn.getInputStream ();
Metti questo codice in un try/catch. Se ti becchi una eccezione (tipicamente
UnknownHostException ma anche FileNotFoundException), allora l'URL non
esiste.
-- 
Java Tips - 
http://andbin.altervista.org/java/tips/

Bella idea, inizialmente ci avevo pensato, ma il fatto é che devo fare un 
controllo su siti simili tra loro (che differiscono x una o 2 lettere) e 
quindi mi serve un ciclo di for... e alla prima eccezione uscirei dal ciclo!
Ho risolto cosě:
URL url = new URL(ind);
URLConnection a = url.openConnection();
if(!(a.getHeaderField(0).equals("HTTP/1.1 404 Not Found")))
    // allora il sito esiste e vi opera nei modi a me interessati
Non so francamente se sia la strada piů agevole, ma di fatto funziona!
Se qualcuno ha qualche altra idea, magari equivalente, é ben accetta!


 ciclo!
Mi permetto di dissentire, se sai fare bene il ciclo for e sai dove mettere 
il try/catch ;D
Saluti
CarMas 

Ammetto ke nella gestione delle eccezioni ho qualche lacuna!
Ma io faccio una cosa di questo tipo, astrattizzando al massimo (uso una 
threadizzazione x velocizzare la ricerca con il parallelo):
for(){
    CercaT cercante = new CercaT();
    cercante.start();
}
e nel run() ho il mio controllo precedentemente descritto:
for(){
    URL url = new URL(ind);
    URLConnection a = url.openConnection();
    if(!(a.getHeaderField(0).equals("HTTP/1.1 404 Not Found")))
}
Nel run, all'atto dell'eventuale chiamata di a.getInputStream(), se trova 
un'eccezione di tipo FileNotFoundException (o quello ke é), non mi esce 
necessariamente dal ciclo for a prescindere da come la gestisco?
O forse intendi:
for(){
try{
    URL url = new URL(ind);
    URLConnection a = url.openConnection();
}
catch(FNFException e){
    // allora il sito non esiste e non faccio nulla
}
    InputStream is = a.getInputStream ();
}
In questo modo?


Ovviamente rettifico... la fretta!
for(){
try{
    URL url = new URL(ind);
    URLConnection a = url.openConnection();


 }
Si, cosi' mi piace gia' di piu' ;D
Saluti
CarMas

 Se qualcuno ha qualche altra idea, magari equivalente, é ben accetta!
Ciao, ho scritto questo metodo:
public static boolean checkUrl (String strUrl, boolean follow)
{
    try
    {
        URL url = new URL (strUrl);
        URLConnection urlConn = url.openConnection ();
        if (urlConn instanceof HttpURLConnection)
        {
            HttpURLConnection httpConn = (HttpURLConnection) urlConn;
            httpConn.setInstanceFollowRedirects (follow);
            httpConn.connect ();
            int response = httpConn.getResponseCode ();
            if (response != 200)
                return false;
        }
        else
        {
            InputStream is = urlConn.getInputStream ();
            is.close ();
        }
        return true;
    }
    catch (Exception e)
    {
        return false;
    }
}
L'ho testato con svariati url reali e fasulli sia su protocollo http che ftp
e sembra che funzioni bene.
C'e` anche la questione del redirect http, per questo ho messo il parametro
follow.
Se con un browser richiedi ad esempio:
http://java.sun.com/jdc/
viene rediretto su:
http://developers.sun.com
A questo punto spetta all'utilizzatore del metodo stabilire se accettare il
redirect oppure no.



Allora avevo capito bene! Probabilmente a livello di dati le 2 soluzioni 
sono equivalenti, ma é bello imparare soluzioni alternative! 

Ormai avevo risolto ma ti ringrazio, il tuo metodo sfrutta molto meglio la 
classe HTTPURLConnection ke nn avevo neppure guardato, in particolare x i 
rindirizzimenti (a cui avevo risolto con metodi molto più specifici e 
"spartani", tipo controllare il codice html iniziale della pagina).
Ne terrò conto in futuro!
