Je voulais savoir s’il existait des API standard dans Java pour valider une URL donnée? Je souhaite vérifier à la fois si la chaîne de l’URL est correcte, c’est-à-dire que le protocole donné est valide et ensuite si un la connexion peut être établie.
J'ai essayé d'utiliser HttpURLConnection, en fournissant l'URL et en me connectant. La première partie de mon exigence semble être remplie, mais lorsque j'essaie d'exécuter HttpURLConnection.connect (), une exception 'Java.net.ConnectException: Connection denied' est émise.
Cela peut-il être dû aux paramètres de proxy? J'ai essayé de définir les propriétés système pour le proxy, mais sans succès.
Dites-moi ce que je fais mal.
Pour le bénéfice de la communauté, puisque ce fil est en tête de liste de Google lors de la recherche de
" validateur d'URL Java "
La détection des exceptions coûte cher et doit être évitée autant que possible. Si vous voulez juste vérifier que votre chaîne est une URL valide, vous pouvez utiliser le UrlValidator classe 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");
}
Vous devez créer un objet URL
et un objet 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 réalité pas un bon moyen de valider des URL. MalformedURLException
est not renvoyé sur toutes les URL malformées pendant la construction. La capture de IOException
sur Java.net.URL#openConnection().connect()
ne valide pas l'URL non plus, indique seulement si la connexion peut être établie ou non.
Considérons 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 une API de validation mise en œuvre à l'aide d'une grammaire dépourvue de 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, je n'ai que récemment commencé à la rechercher moi-même.
Note Il a été suggéré que URL#toURI()
en combinaison avec le traitement de l'exception Java.net. URISyntaxException
Puisse 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’existe pas d’analyseur d’URL standard pour la validation des URL Java).
En utilisant niquement l'API standard, transmettez la chaîne à un objet URL
, puis convertissez-la en un objet URI
. Cela déterminera 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;
}
Utilisez le Android.webkit.URLUtil
sur Android:
URLUtil.isValidUrl(URL_STRING);
Remarque: Il s’agit simplement de vérifier le schéma initial de l’URL, mais pas que l’URL complète est valide.
Il existe un moyen d'effectuer la validation d'URL en stricte conformité avec les normes de Java sans recourir à 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 qu'il s'agit d'une URL (absolue ou relative) et non d'un URN.
Il est important de souligner que l'objet 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 valables. 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()
. Un peu exagéré si vous voulez juste valider la syntaxe de l'URL, une expression rationnelle semble être une solution plus simple.
Êtes-vous sûr que vous utilisez le bon proxy en tant que propriétés système?
De même, si vous utilisez 1.5 ou 1.6, vous pouvez transmettre une instance de Java.net.Proxy à la méthode openConnection (). C'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);