W3docs

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    ref

java.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 base

Le 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 connection

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

java— editable, runs on the server

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 #intro via getRef(). Une URL est une valeur structurée, pas simplement du texte — l'analyser une fois et lire les champs est bien plus efficace que manipuler String.split manuellement sur / et ?.
  • L'URL sans port a retourné getPort() == -1 tandis que getDefaultPort() a renvoyé 80. Cette distinction importe lors de l'établissement d'une connexion : -1 signifie « le port a été omis », et vous revenez au port par défaut du protocole plutôt que de traiter -1 comme 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 URL via URI.create(...).toURL() plutôt que le new URL(String) déprécié. Sur les JDK modernes, c'est la voie recommandée : analyser et valider avec URI, convertir en URL uniquement au moment d'ouvrir une connexion.
  • URI.equals a comparé deux URI identiques textuellement et a retourné true sans impliquer le réseau. C'est la manière sûre de comparer et d'utiliser comme clés de dictionnaire — URL.equals aurait 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.

Exercices pratiques

Pratique
Un collègue stocke les ressources téléchargées dans un 'HashSet<URL>' pour éviter les doublons, et remarque que le programme est lent et se bloque parfois hors ligne. Quelle est la bonne explication et la solution ?
Un collègue stocke les ressources téléchargées dans un 'HashSet<URL>' pour éviter les doublons, et remarque que le programme est lent et se bloque parfois hors ligne. Quelle est la bonne explication et la solution ?
Was this page helpful?