119 votes

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 à la fois vérifier si la chaîne de l'URL est correcte, c'est-à-dire si le protocole donné est valide, et ensuite vérifier si une connexion peut être établie.

J'ai essayé d'utiliser HttpURLConnection, en fournissant l'URL et en m'y connectant. La première partie de mon exigence semble être satisfaite mais lorsque j'essaie d'exécuter HttpURLConnection.connect(), l'exception 'java.net.ConnectException : Connexion refusée" est levée.

Cela peut-il être dû aux paramètres du proxy ? J'ai essayé de configurer les propriétés du système pour le proxy, mais sans succès.

Dites-moi ce que je fais de mal.

173voto

Yonatan Points 944

Pour le bénéfice de la communauté, puisque ce fil de discussion est en tête de liste sur Google lorsqu'on recherche " validateur d'url java " :
La capture des exceptions est coûteuse et doit être évitée dans la mesure du possible. Si vous voulez simplement vérifier que votre chaîne est une URL valide, vous pouvez utiliser Apache validateur commun URLValidator classe. 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");
}

41voto

Martin Points 747

El java.net.URL n'est en fait pas du tout un bon moyen de valider les URL. MalformedURLException es no lancé sur toutes les URL mal formées pendant la construction. Attraper IOException en java.net.URL#openConnection().connect() ne valide pas non plus l'URL, mais indique seulement 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 lève aucune exception.

Je recommande l'utilisation d'une API de validation implémentée à l'aide d'une grammaire libre de contexte ou, pour une validation très simplifiée, l'utilisation d'expressions régulières. Cependant, j'ai besoin que quelqu'un me suggère une API supérieure ou standard pour cela, je n'ai que récemment commencé à la chercher moi-même.

Note 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 en compte qu'un seul des cas très simples ci-dessus.

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

33voto

Olly Points 4314

Vous devez créer à la fois un URL et un objet URLConnection objet. 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
}

25voto

b1nary.atr0phy Points 1043

Utilisation de uniquement l'API standard, passez la chaîne à un URL puis le convertir en un objet URI objet. 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;  
}

0voto

NickDK Points 1561

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

Si vous utilisez la version 1.5 ou 1.6, vous pouvez également passer une instance de java.net.Proxy à la méthode openConnection(). C'est plus élégant :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X