Séance 2 : formats de données ============================= .. include:: common.rst.inc .. ifslides:: .. include:: credits.rst.inc Introduction ++++++++++++ Motivation ---------- Lors de la séance précédente, vous avez utilisé des expressions régulières pour analyser le contenu des pages. * laborieux * limité au HTML * fragile Type de contenu +++++++++++++++ Présentation ------------ Il existe une `taxonomie standard`__ des formats de données, appelés types de contenu (*media types*). __ http://www.iana.org/assignments/media-types/media-types.xhtml Ces types de contenu ont une structure à deux niveaux ; exemples : * ``text/html`` * ``text/plain`` * ``image/png`` * ``audio/mpeg`` * ``video/H264`` * ``application/pdf`` Type de contenu d'un message HTTP --------------------------------- Tout message HTTP qui comporte un contenu doit spécifier son format, à l'aide de l'en-tête ``Content-Type``. .. rst-class:: response .. code-block:: none Content-Type: text/html; charset=utf-8 Négociation de contenu ---------------------- Dans la requête, le client peut indiquer au serveur les types de contenu qu'il est capable de traiter, à l'aide du champs ``Accept``. .. rst-class:: request .. code-block:: none Accept: text/html,application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8 Le verbe ``HEAD`` ----------------- Lorsqu'on est intéressé uniquement par les en-têtes, et *pas* par le contenu, on peut utiliser le verbe ``HEAD`` au lieu du verbe ``GET``. Formats usuels ++++++++++++++ HTML : ``text/html`` -------------------- Format *documentaire*, surtout destiné à l'affichage. Sauf pour les serveurs qui ne fournissent *que* ce format, on lui préférera des formats plus adaptés au traitement automatique. HTML en Java ```````````` Bibliothèque Jsoup_ (installation maven__). .. _Jsoup: http://jsoup.org/ __ http://mvnrepository.com/artifact/org.jsoup/jsoup XML : ``application/xml`` ------------------------- Peut être vu comme une extension de HTML, autorisant n'importe quelle balise : .. code-block:: xml
2 10.10
7 42.00
XML en Java ``````````` Disponible en standard : `javax.xml.parsers`__. .. code-block:: java DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = db.parse(inputStream, urlString); __ http://docs.oracle.com/javase/9/docs/api/javax/xml/parsers/package-summary.html JSON ---- Sous-ensemble de Javascript, limité à la description de données : .. code-block:: json { "no_commande": "12345", "no_client": "678-789", "articles": [ { "code": "ab12", "quantite": 2, "prix": 10.10 }, { "code": "cd34", "quantite": 7, "prix": 42.10 } ] } `Pour en savoir plus`__ __ http://champin.net/enseignement/intro-js/s3.html#json JSON en Java ```````````` Bibliothèque GSON_ (installation maven__). .. _GSON: https://code.google.com/p/google-gson/ __ http://mvnrepository.com/artifact/com.google.code.gson/gson Votre travail +++++++++++++ Votre travail ------------- Améliorez le programme de la séance précédente : #. en remplaçant les expression régulières par un véritable *parser* HTML (par exemple JSoup_) ; #. en vérifiant si l'URL passée au programme retourne bien du HTML, et en ne comptant les liens *que* dans ce cas ; #. en utilisant le verbe ``HEAD`` (au lieu de ``GET``) pour vérifier la validité des liens ; #. en affichant le nombre de liens valides par grande catégorie de contenu (``text``, ``image``, ``audio``...).