Manipuler des objets java.net.URL

Bien que sauver une URL sous forme de chaîne de caractères semble sans conséquences, il est préférable de considérer une URL comme un objet (“Oriented Object Minded”3), dont nous pouvons manipuler les champs tels que protocole, nom d'hôte, port, requête, etc.

La classe java.net.URL est une abstraction d'une URL dont les instances sont utilisées pour référer ou pour accéder à un objet sur l'Internet. Au lieu d'utiliser l'héritage pour les instances des différentes sortes d'URL, la classe URL utilise le strategy pattern, pour lequel le gestionnaire de protocole (“protocol handler”) représente la stratégie.

Contents Haut

Créer un objet URL

Une URL est immutable.

Nous ne devons pas nous préoccuper des détails du protocole utilisé, du format des données qui seront récupérées, ni de la manière de communiquer avec le serveur.

Un objet URL peut être construit depuis une chaîne de caractères, ou en spécifiant les champs individuels (protocole, nom d'hôte, port, requête, etc.). Nous pouvons aussi spécifier qu'une URL est relative à une autre URL.

Les 6 constructeurs à notre disposition sont suceptibles de lancer une exception de type MalformedURLException si nous tentons de créer un objet URL ayant un protocole non supporté. Les protocoles supportés dépendent de l'implémentation. Si nous désirons utiliser un protocole qui n'est pas supporté par la machine virtuelle Java (JVM), nous devons installer un gestionnaire de protocole (“protocol handler”).

Le code suivant affiche les protocoles supportés en utilisant l'exception levée.


Code Java (SupportedJVMProtocols) (44 lignes) :
  1. package protocols;
  2.  
  3. import java.net.MalformedURLException;
  4. import java.net.URL;
  5. import java.util.Iterator;
  6. import java.util.Set;
  7. import java.util.TreeSet;
  8.  
  9. public class SupportedJVMProtocols {
  10.   private Set protocols = new TreeSet();
  11.  
  12.   public SupportedJVMProtocols(){
  13.     protocols.add("http://www.gaudry.be/");
  14.     protocols.add("mailto:infobrol@ibelgique.com");
  15.     protocols.add("telnet://localhost:8080/");
  16.     protocols.add("file://C://temp");
  17.     protocols.add("gopher://info.asu.edu/");
  18.     protocols.add("nfs://acides.adn/arn/shemas/");
  19.     protocols.add("rmi://metalab.inc.edu/RenderEngine");
  20.     protocols.add("verbatim:http://www.adc.org/");
  21.     protocols.add("jdbc:mysql://purine.guanine.edu:3306/News");
  22.   }
  23.  
  24.   public void search(){
  25.     Iterator itr = protocols.iterator();
  26.     String urlString = null;
  27.     while(itr.hasNext()){
  28.       try{
  29.         urlString = (String)itr.next();
  30.         URL url = new URL(urlString);
  31.         System.out.println(url.getProtocol() + " is supported");
  32.       }
  33.       catch (MalformedURLException e){
  34.         String protocol = urlString.substring(0, urlString.indexOf(':'));
  35.         System.out.println(protocol + " is not supported");
  36.       }
  37.     }
  38.   }
  39.  
  40.   public static void main(String[] args) {
  41.     SupportedJVMProtocols s = new SupportedJVMProtocols();
  42.     s.search();
  43.   }
  44. }

Ce qui devrait donner plus ou moins ceci :

file is supported
gopher is supported
http is supported
jdbc is not supported
mailto is supported
nfs is not supported
rmi is not supported
telnet is not supported
verbatim is supported

Contents Haut

Contents Haut

Récupérer des données depuis une URL

Trois manières s'offrent à nous pour accéder aux données par un objet URL :

  • La méthode openStream() nous retourne l'information au travers d'un objet InputStream.
  • La méthode openConnection() nous retourne un objet URLConnection.
  • Les méthodes getContent() et getContent(Class[] classes) nous retournent le contenu.

Contents Haut

Méthode openStream()

La méthode openStream() nous permet de nous connecter à la ressource référencée par l'URL, en effectuant les transactions nécessaires entre le client et le serveur (“hand-shaking”6). Cette méthode nous retourne l'information par le biais d'un InputStream.

Par cette méthode, nous n'avons aucun accès aux en-têtes HTTP, ni aucune information relative au protocole. Les données ne sont donc pas interprétées, et sont récupérées telles qu'elles sont lues sur la ressource. Nous ne pouvons donc obtenir aucune information sur l'encodage des données que nous retourne le flux. Par exemple, dans le cas de la lecture d'une page Web, nous devons mettre en place un parseur pour extraire la balise meta spécifiant l'encodage, dans l'en-tête du document si cette dernière est présente.

Contents Haut

Méthode openConnection()

La méthode openConnection() nous offre la possibilité d'accéder aux headers HTTP, ce que ne nous permettait pas la méthode openStream(). openConnection() ouvre pour nous un socket vers l'URL spécifiée, et nous retourne une connexion ouverte vers la ressource désirée, au travers d'un objet URLConnection. Nous pouvons donc communiquer directement avec le serveur.

Contents Haut

Méthode getContent()

Les méthodes getContent() et getContent(Class[] classes) nous permettent de récupérer le contenu référencé par l'URL, et tentent de créer à partir du flux un objet dont le type est déterminé par le type MIME.

Avec la méthode getContent(), nous pouvons peu aisément déterminer le type d'objet que nous récupèrerons. Il est alors préférable d'utilmiser la méthode getContent(Class[] classes), en combinaison avec un test instanceof pour déterminer quelle classe dans le tableau est retournée.

Contents Haut

English translation

You have asked to visit this site in English. For now, only the interface is translated, but not all the content yet.

If you want to help me in translations, your contribution is welcome. All you need to do is register on the site, and send me a message asking me to add you to the group of translators, which will give you the opportunity to translate the pages you want. A link at the bottom of each translated page indicates that you are the translator, and has a link to your profile.

Thank you in advance.

Document created the 25/10/2005, last modified the 02/08/2019
Source of the printed document:https://www.gaudry.be/en/java-url.html

The infobrol is a personal site whose content is my sole responsibility. The text is available under CreativeCommons license (BY-NC-SA). More info on the terms of use and the author.

Notes

  1. a,b,c,d,e,f… 5 more links… Uniform Resource Locator : corresponds to « localisateur uniforme de ressource » en français

  2. a,b,c,d,e,f… 5 more links… URL : “Uniform Resource Locator” (en français, « localisateur uniforme de ressource »)

  3.  Oriented Object Minded : corresponds to « conçeption orienté-objet » en français

  4.  Java irtual Machine : corresponds to « machine virtuelle Java » en français

  5.  JVM : “Java irtual Machine” (en français, « machine virtuelle Java »)

  6.  hand-shaking : corresponds to « poignée de mains » en français

  7.  hand-shaking : « Bonjour, c'est moi le client ! » « Ah salut c'est toi, moi c'est le serveur »

  8. a,b Hypertext Transfer Protocol : corresponds to « protocole de transfert hypertexte » en français

  9. a,b HTTP : “Hypertext Transfer Protocol” (en français, « protocole de transfert hypertexte »)

  10.  Hypertext Markup Language : corresponds to « langage de balisage hypertexte » en français

  11.  HTML : “Hypertext Markup Language” (en français, « langage de balisage hypertexte »)

Contents Haut