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.

Inhoudsopgave 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

Inhoudsopgave Haut

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

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

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

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

Nederlandse vertaling

U hebt gevraagd om deze site in het Nederlands te bezoeken. Voor nu wordt alleen de interface vertaald, maar nog niet alle inhoud.

Als je me wilt helpen met vertalingen, is je bijdrage welkom. Het enige dat u hoeft te doen, is u op de site registreren en mij een bericht sturen waarin u wordt gevraagd om u toe te voegen aan de groep vertalers, zodat u de gewenste pagina's kunt vertalen. Een link onderaan elke vertaalde pagina geeft aan dat u de vertaler bent en heeft een link naar uw profiel.

Bij voorbaat dank.

Document heeft de 25/10/2005 gemaakt, de laatste keer de 02/08/2019 gewijzigd
Bron van het afgedrukte document:https://www.gaudry.be/nl/java-url.html

De infobrol is een persoonlijke site waarvan de inhoud uitsluitend mijn verantwoordelijkheid is. De tekst is beschikbaar onder CreativeCommons-licentie (BY-NC-SA). Meer info op de gebruiksvoorwaarden en de auteur.

Notes

  1. a,b,c,d,e,f… 5 meer links… Uniform Resource Locator : komt overeen met « localisateur uniforme de ressource » en français

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

  3.  Oriented Object Minded : komt overeen met « conçeption orienté-objet » en français

  4.  Java irtual Machine : komt overeen met « machine virtuelle Java » en français

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

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

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

Inhoudsopgave Haut