Je voulais savoir s'il existe des API standard en Java pour valider une URL donnée? Je veux vérifier à la fois si la chaîne d'URL est correcte, c'est-à-dire que le protocole donné est valide, puis pour vérifier si une 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 refusée» est levée.
Cela peut-il être dû aux paramètres de proxy? J'ai essayé de définir les propriétés système du proxy mais sans succès.
Faites-moi savoir ce que je fais de mal.
java
validation
url
Keya
la source
la source
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 accessible (via une connexion http, par exemple).Réponses:
Pour le bénéfice de la communauté, puisque ce fil est en tête sur Google lors de la recherche de
" url validator java "
Attraper des exceptions est coûteux et doit être évité lorsque cela est 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:
la source
Vous devez créer à la fois un
URL
objet et unURLConnection
objet. Le code suivant testera à la fois le format de l'URL et si une connexion peut être établie:la source
new HttpGet(url)
, vous pouvez attraper lesIllegalArgumentException
HttpGet(...)
lancers s'il y a une URL mal formée. Et vousHttpResponse
lancera également des trucs s'il y a un problème avec l'obtention des données.La
java.net.URL
classe n'est en fait pas du tout un bon moyen de valider les URL.MalformedURLException
n'est pas lancée sur toutes les URL mal formées pendant la construction. AttraperIOException
surjava.net.URL#openConnection().connect()
ne valide pas l' URL soit, dire que si oui ou non la connexion peut être établie.Considérez ce morceau de code:
..qui 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, utilisez 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 commencé que récemment à la rechercher moi-même.
Remarque Il a été suggéré qu'en
URL#toURI()
combinaison avec la gestion de l'exceptionjava.net. URISyntaxException
peut faciliter la validation des URL. Cependant, cette méthode n'attrape qu'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.
la source
En utilisant uniquement l'API standard, passez la chaîne à un
URL
objet puis convertissez-la enURI
objet. Cela déterminera avec précision la validité de l'URL selon la norme RFC2396.Exemple:
la source
Utilisez le
android.webkit.URLUtil
sur Android:Remarque: il s'agit simplement de vérifier le schéma initial de l'URL, et non pas que l'URL entière soit valide.
la source
Il existe un moyen d'effectuer la validation d'URL dans le strict respect des normes Java sans recourir à des bibliothèques tierces:
Le constructeur de
URI
vérifications quiurl
est un URI valide, et l'appel àparseServerAuthority
garantit qu'il s'agit d'une URL (absolue ou relative) et non d'un URN.la source
URI
appel du constructeur et de l'parseServerAuthority
appel valide l'URL, pasparseServerAuthority
seule.://
vient après l'hôte,:
introduit le numéro de port, qui peut être vide selon la syntaxe.//
est une partie du chemin avec un segment vide, qui est également valide. Si vous entrez cette adresse dans votre navigateur, il essaiera de l'ouvrir (mais ne trouvera probablement pas le serveur nomméhttps
;)).Il est simplement 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 ( file , ftp , gopher , http , https , jar , mailto , netdoc ) sont valides. Par exemple, essayez de créer une nouvelle URL avec le protocole ldap :
Vous obtiendrez un fichier
java.net.MalformedURLException: unknown protocol: ldap
.Vous devez implémenter votre propre gestionnaire et l'enregistrer via
URL.setURLStreamHandlerFactory()
. Tout à fait exagéré si vous souhaitez simplement valider la syntaxe de l'URL, une expression régulière semble être une solution plus simple.la source
Êtes-vous sûr d'utiliser le bon proxy comme propriétés système?
De plus, si vous utilisez 1.5 ou 1.6, vous pouvez passer une instance java.net.Proxy à la méthode openConnection (). C'est imo plus élégant:
la source
Je pense que la meilleure réponse vient de l'utilisateur @ b1nary.atr0phy. D'une manière ou d'une autre, je recommande de combiner la méthode de la réponse b1nay.atr0phy avec un regex pour couvrir tous les cas possibles.
la source
"((http|https|ftp)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"
( source ). Le seul inconvénient de cette expression régulière est que, par exemple, "127.0..0.1" et "127.0" sont valides.Merci. Ouvrir la connexion URL en passant le proxy comme suggéré par NickDK fonctionne très bien.
Les propriétés système ne fonctionnent cependant pas comme je l'avais mentionné plus tôt.
Merci encore.
Cordialement, Keya
la source