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.

Table des matières 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.

  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. String protocol = urlString.substring(0, urlString.indexOf(':'));
  34. System.out.println(protocol + " is not supported");
  35. }
  36. }
  37. }
  38.  
  39. public static void main(String[] args) {
  40. SupportedJVMProtocols s = new SupportedJVMProtocols();
  41. s.search();
  42. }
  43. }

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

Table des matières Haut

Table des matières 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.

Table des matières 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.

Table des matières 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.

Table des matières 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.

Document créé le 25/10/2005, dernière modification le 02/08/2019
Source du document imprimé : https://www.gaudry.be/java-url.html

L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.

Notes

  1. a,b,c,d,e,f… 5 en plus… Uniform Resource Locator : correspond à « localisateur uniforme de ressource » en français

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

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

  4.  Java irtual Machine : correspond à « machine virtuelle Java » en français

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

  6.  hand-shaking : correspond à « 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 : correspond à « 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 : correspond à « langage de balisage hypertexte » en français

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

Table des matières Haut