2009-10-21 10 views
82

Je voulais savoir s'il y avait des API standard en Java pour valider une URL donnée? Je veux vérifier les deux si la chaîne d'URL est correcte, c'est-à-dire que le protocole donné est valide, puis vérifier si une connexion peut être établie.Valider l'URL en Java

J'ai essayé d'utiliser HttpURLConnection en fournissant l'URL et en me connectant à celle-ci. La première partie de mon exigence semble être remplie, mais lorsque j'essaie d'exécuter HttpURLConnection.connect(), l'exception 'java.net.ConnectException: Connection refused' est levée.

Est-ce que cela peut être dû aux paramètres de proxy? J'ai essayé de définir les propriétés du système pour le proxy, mais sans succès. Faites-moi savoir ce que je fais mal.

+2

Il semble y avoir 2 questions ici; Validation de l'URL et recherche de la cause d'une ConnectException –

+0

Puisqu'il s'agit du premier google hit de 'java url validator', il y a en effet des questions ici, comment valider l'URL (en regardant la chaîne) et comment vérifier si l'URL est joignable (via une connexion http, par exemple). – vikingsteve

Répondre

2

Etes-vous sûr d'utiliser le proxy correct en tant que propriétés système?

De même, si vous utilisez 1.5 ou 1.6, vous pouvez passer une instance de java.net.Proxy à la méthode openConnection(). Ceci est plus élégant imo:

//Proxy instance, proxy ip = 10.0.0.1 with port 8080 
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080)); 
conn = new URL(urlString).openConnection(proxy); 
34

Vous devez créer à la fois un objet et un objet URLURLConnection. Le code suivant testera le format de l'URL et si une connexion peut être établie:

try { 
    URL url = new URL("http://www.yoursite.com/"); 
    URLConnection conn = url.openConnection(); 
    conn.connect(); 
} catch (MalformedURLException e) { 
    // the URL is not in a valid form 
} catch (IOException e) { 
    // the connection couldn't be established 
} 
+0

Notez qu'il existe plusieurs façons de vérifier les URL/problèmes malformés. Par exemple, si vous utilisez votre URL pour un 'new HttpGet (url)', alors vous pouvez attraper le 'HttpGet (...)' 'IllegalArgumentException'' 'throws s'il y a une url malformée. Et 'HttpResponse' vous lancera aussi des trucs s'il y a un problème avec l'obtention des données. –

+1

La connexion valide uniquement la disponibilité de l'hôte. N'a rien à voir avec la validité de l'URL. –

+1

MalformedURLException n'est pas une stratégie sûre pour tester la forme valide d'une URL. Cette réponse est trompeuse. – Martin

0

Merci. Ouverture de la connexion URL en passant le proxy comme suggéré par NickDK fonctionne très bien.

//Proxy instance, proxy ip = 10.0.0.1 with port 8080 
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080)); 
conn = new URL(urlString).openConnection(proxy); 

Les propriétés du système ne fonctionnent cependant pas comme je l'ai mentionné précédemment.

Merci encore.

Cordialement, Keya

1

Juste important de que l'objet URL gérer à la fois la validation et la connexion. Ensuite, seuls les protocoles pour lesquels un gestionnaire a été prévu dans sun.net.www.protocol sont autorisés (fichier, ftp, gopher, http, https, pot, mailto, netdoc) sont valides. Par exemple, essayez de faire une nouvelle URL avec le protocole ldap:

new URL("ldap://myhost:389")

Vous obtiendrez un java.net.MalformedURLException: unknown protocol: ldap.

Vous devez implémenter votre propre gestionnaire et l'enregistrer via URL.setURLStreamHandlerFactory(). Si vous voulez simplement valider la syntaxe de l'URL, une regexp semble être une solution plus simple.

122

Pour le bénéfice de la communauté, car ce fil est top sur Google lorsque vous recherchez
"url validateur java"


Attraper les exceptions est coûteuse, et devrait être évitée si possible . Si vous voulez juste vérifier que votre chaîne est une URL valide, vous pouvez utiliser la classe UrlValidator du projet Apache Commons Validator.

Par exemple:

String[] schemes = {"http","https"}; // DEFAULT schemes = "http", "https", "ftp" 
UrlValidator urlValidator = new UrlValidator(schemes); 
if (urlValidator.isValid("ftp://foo.bar.com/")) { 
    System.out.println("URL is valid"); 
} else { 
    System.out.println("URL is invalid"); 
} 
+30

Cette classe URLValidator est marquée dépréciée. L'URLValidator recommandé est dans le paquet routines: http://commons.apache.org/validator/apidocs/org/apache/commons/validator/routines/UrlValidator.html – Spektr

+5

@Spektr J'ai corrigé le lien. Merci. – Yonatan

+0

existe-t-il une bibliothèque similaire pour la validation des adresses e-mail? –

27

La classe java.net.URL est en fait pas du tout un bon moyen de valider les URL. MalformedURLException est pas jeté sur toutes les URL mal formées pendant la construction. Attraper IOException sur java.net.URL#openConnection().connect() ne valide pas l'URL non plus, seulement dire si oui ou non la connexion peut être établie.

Tenir compte ce morceau de code:

try { 
     new URL("http://.com"); 
     new URL("http://com."); 
     new URL("http:// "); 
     new URL("ftp://::::@example.com"); 
    } catch (MalformedURLException malformedURLException) { 
     malformedURLException.printStackTrace(); 
    } 

..which ne jette aucune exception.

Je recommande d'utiliser une API de validation implémentée à l'aide d'une grammaire sans contexte, ou dans une validation très simplifiée, d'utiliser simplement des expressions régulières. Cependant, j'ai besoin de quelqu'un pour suggérer une API supérieure ou standard pour cela, j'ai récemment commencé à chercher moi-même.

Remarque Il a été suggéré que URL#toURI() en combinaison avec le traitement de l'exception java.net. URISyntaxException peut faciliter la validation des URL. Cependant, cette méthode ne prend que l'un des cas très simples ci-dessus.

La conclusion est qu'il n'y a pas d'analyseur d'URL java standard pour valider les URL.

+0

Avez-vous trouvé une solution à ce problème? –

+0

@ bi0s.kidd0 Il y a plusieurs bibliothèques qui peuvent être utilisées, mais nous avons décidé de faire notre propre compilation. Il n'est pas complet, mais peut analyser ce qui nous intéresse, y compris les URL contenant des domaines ou des adresses IP (à la fois v4 et v6). https://github.com/jajja/arachne – Martin

9

En utilisant uniquement API standard, passez la chaîne à un objet URL puis le convertir en un objet URI. Cela permettra de déterminer avec précision la validité de l'URL selon la norme RFC2396.

Exemple:

public boolean isValidURL(String url) { 

    URL u = null; 

    try { 
     u = new URL(url); 
    } catch (MalformedURLException e) { 
     return false; 
    } 

    try { 
     u.toURI(); 
    } catch (URISyntaxException e) { 
     return false; 
    } 

    return true; 
} 
+4

Notez que ce schéma de validation string-> url-> uri signale que ces cas de test sont valides: "http: //.com" "http: // com. " "ftp: // :::: @ example.com" "http: /test.com" "http: test.com" "http: /:" Ainsi, alors que cela est API standard, la validation les règles qu'il applique peuvent ne pas être ce que l'on attend. – DaveK

+0

Cette approche est bonne, mais les urls comme http: // ... sont valides, mais elles ne le sont pas. – ekitru

7

Utilisez le android.webkit.URLUtil sur Android:

URLUtil.isValidUrl(URL_STRING); 

Note: Il est en train de vérifier le schéma initial d'URL, pas que l'URL complète est valide.

+1

Seulement si vous travaillez sur une application android ofcourse. – miva2

1

Il existe un moyen pour effectuer la validation des URL dans le strict respect des normes en Java sans avoir recours à des bibliothèques tierces:

boolean isValidURL(String url) { 
    try { 
    new URI(url).parseServerAuthority(); 
    return true; 
    } catch (URISyntaxException e) { 
    return false; 
    } 
} 

Le constructeur de URI vérifie que url est un URI valide, et l'appel à parseServerAuthority garantit que c'est une URL (absolue ou relative) et non un URN.