Validation de l’URL en Java

Je voulais savoir s’il existe des API standard en Java pour valider une URL donnée? Je veux vérifier 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.

J’ai essayé d’utiliser HttpURLConnection, en fournissant l’URL et en s’y connectant. 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 denied» est levée.

Est-ce possible à cause des parameters 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.

Pour le bénéfice de la communauté, puisque ce fil est en tête sur Google lors de la recherche
validateur d’url java


Prendre des exceptions est coûteux et devrait être évité dans la mesure du possible. Si vous souhaitez simplement vérifier que votre chaîne est une URL valide, vous pouvez utiliser la classe UrlValidator du projet Apache Commons Validator .

Par exemple:

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

Vous devez créer à la fois un object URL et un object URLConnection . Le code suivant testera à la fois 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 } 

La classe java.net.URL n’est en fait pas un bon moyen de valider les URL. MalformedURLException n’est pas lancée sur toutes les URL malformées pendant la construction. Catching IOException sur java.net.URL#openConnection().connect() ne valide pas non plus l’URL, mais indique uniquement si la connexion peut être établie ou non.

Considérez 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(); } 

..qui ne jette aucune exception.

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

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

La conclusion est qu’il n’existe pas d’parsingur d’URL Java standard pour valider les URL.

En utilisant uniquement l’API standard, transmettez la chaîne à un object URL , puis convertissez-la en object URI . Cela déterminera avec précision la validité de l’URL conformément à la norme RFC2396.

Exemple:

 public boolean isValidURL(Ssortingng url) { URL u = null; try { u = new URL(url); } catch (MalformedURLException e) { return false; } try { u.toURI(); } catch (URISyntaxException e) { return false; } return true; } 

Utilisez le android.webkit.URLUtil sur Android:

 URLUtil.isValidUrl(URL_STRING); 

Remarque: Il suffit de vérifier le schéma initial de l’URL, et non pas que l’URL entière soit valide.

Êtes-vous sûr d’utiliser le bon proxy comme propriétés du système?

Aussi, si vous utilisez 1.5 ou 1.6, vous pouvez passer une instance 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(urlSsortingng).openConnection(proxy); 

Juste important de signaler que l’object URL gère à la fois la validation et la connexion. Ensuite, seuls les protocoles pour lesquels un gestionnaire a été fourni dans sun.net.www.protocol sont autorisés ( fichier , ftp , gopher , http , https , jar , mailto , netdoc ) sont valides. Par exemple, essayez de créer 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 expression rationnelle semble être une solution plus simple.

Il existe un moyen d’effectuer la validation d’URL conformément aux normes de Java sans recourir à des bibliothèques tierces:

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

Le constructeur de l’ URI vérifie que l’ url est un URI valide, et l’appel à parseServerAuthority garantit qu’il s’agit d’une URL (absolue ou relative) et non d’un URN.

Merci. L’ouverture de la connexion URL en passant le proxy comme suggéré par NickDK fonctionne correctement.

 //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(urlSsortingng).openConnection(proxy); 

Les propriétés du système ne fonctionnent cependant pas comme je l’avais mentionné plus tôt.

Merci encore.

Cordialement, Keya