Classe URL Java
Analysez et représentez des URL en Java avec la classe URL — protocole, hôte, port, chemin, requête.
Une URL (Uniform Resource Locator) identifie une ressource et la manière d'y accéder : https://www.example.com:443/docs?q=net#top. Java la modélise avec java.net.URL, qui analyse une URL en ses composants et peut ouvrir une connexion pour la récupérer. Ce chapitre porte sur l'analyse et la structure ; l'ouverture d'une connexion pour récupérer des octets est traitée dans Java URLConnection.
Cette page couvre les parties d'une URL, les accesseurs qui les exposent, comment construire une URL (y compris la résolution de références relatives), et pourquoi le code moderne devrait préférer URI plutôt que les constructeurs URL dépréciés acceptant une chaîne de caractères.
L'anatomie d'une URL
https://user:[email protected]:8443/docs/java?topic=net#intro
└─┬─┘ └──┬──┘ └──────┬───────┘└┬─┘└───┬────┘ └────┬────┘└─┬─┘
protocol userInfo host port path query refjava.net.URL expose chaque partie via un accesseur : getProtocol(), getUserInfo(), getHost(), getPort(), getPath(), getQuery() et getRef() (le fragment). getPort() retourne -1 quand aucun port n'est spécifié ; getDefaultPort() donne le port par défaut du protocole (80 pour http, 443 pour https).
Construire une URL
URL url = new URL("https://example.com/path?x=1"); // from a string
URL rel = new URL(base, "../images/logo.png"); // relative to a baseLe constructeur à deux arguments résout une référence relative par rapport à une URL de base — la même règle qu'un navigateur applique pour un lien sur une page. C'est ainsi que l'on transforme ../images/logo.png sur une page à /a/b/page.html en /a/images/logo.png absolu.
Préférer URI pour l'analyse et la validation
Sur les JDK modernes, les constructeurs URL acceptant une chaîne sont dépréciés. URL est désormais destiné à ouvrir des connexions, pas à analyser ou valider. Pour une analyse pure, utilisez java.net.URI et convertissez uniquement quand vous avez besoin de vous connecter :
URI uri = URI.create("https://example.com/path?x=1"); // parse / validate
URL url = uri.toURL(); // only to open a connectionIl existe également un piège notoire à connaître : URL.equals() et URL.hashCode() peuvent effectuer une résolution DNS pour comparer les hôtes, les rendant lents et dépendants du réseau. Ne placez jamais des objets URL dans un HashSet ni ne les utilisez comme clés de dictionnaire — utilisez URI, dont l'égalité est purement textuelle.
Un exemple concret : décomposer et résoudre des URL
Ce programme analyse une URL complète en ses parties, résout une référence relative, et compare URL avec URI plus adapté à l'analyse — tout en mode hors ligne, car l'analyse ne touche pas au réseau.
Ce qu'il faut retenir de l'exécution :
- Chaque accesseur a extrait une tranche étiquetée de la chaîne URL unique : protocole, informations utilisateur, hôte, port, chemin, requête, et le fragment
#introviagetRef(). Une URL est une valeur structurée, pas simplement du texte — l'analyser une fois et lire les champs est bien plus efficace que manipulerString.splitmanuellement sur/et?. - L'URL sans port a retourné
getPort() == -1tandis quegetDefaultPort()a renvoyé80. Cette distinction importe lors de l'établissement d'une connexion :-1signifie « le port a été omis », et vous revenez au port par défaut du protocole plutôt que de traiter-1comme un port réel. base.resolve("../images/logo.png")a produit une URL absolue en remontant de/a/b/— la même résolution de lien relatif qu'effectue un navigateur. Les références relatives sont résolues par rapport à une base, donc le chemin de la base détermine où atterrit...- L'exemple a construit le
URLviaURI.create(...).toURL()plutôt que lenew URL(String)déprécié. Sur les JDK modernes, c'est la voie recommandée : analyser et valider avecURI, convertir enURLuniquement au moment d'ouvrir une connexion. URI.equalsa comparé deux URI identiques textuellement et a retournétruesans impliquer le réseau. C'est la manière sûre de comparer et d'utiliser comme clés de dictionnaire —URL.equalsaurait pu déclencher une résolution DNS pour résoudre l'hôte, ce qui est lent et peut échouer hors ligne.
Une fois que vous avez un URL, l'étape suivante consiste généralement à l'ouvrir. Pour un flux de bas niveau, appelez url.openConnection() (voir Java URLConnection) ; pour une API HTTP moderne et de haut niveau, préférez le Java HttpClient.