web-dev-qa-db-fra.com

Validation de l’URL dans Java

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.

95
Keya

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");
}
140
Yonatan

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
}
36
Olly

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).

31
Martin

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;  
} 
11
b1nary.atr0phy

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.

8
penduDev

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.

5
dened

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.

2
PomCompot

Ê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);
1
NickDK