Ceci est une ancienne révision du document !
Dans cette séquence on va revisiter la syntaxe Pharo, c'est-à-dire qu'on va la revoir quasiment entièrement sur un exemple concret, l'exemple d'une l'application toute simple: http donc issue du monde réel. On va analyser le code et revoir tous les points syntaxiques de Pharo à travers cette analyse.
C'est une application Web classique qui va nous afficher des informations sur des livres. Je vous donne un premier exemple donc on va utiliser le framework Zinc.
ZnClient new url:'http://localhost:8181/books/1'; get
C'est un framework HTTP qu'on reverra dans la suite des cours, composé de deux parties: une partie client et une partie serveur et qui permet d'effectuer des requêtes HTTP. ci, un premier point (ligne 1), on peut voir que ZnClient, c'est une classe donc ça commence par un 'Z' en majuscule comme on l'a vu dans une précédente séquence, les noms de classe, les noms de variables globales commencent par une lettre majuscule. ZnClient est une classe, on lui envoie le message new
ici à cette classe. Cela va nous créer une nouvelle instance de ZnClient.
A cette nouvelle instance, on va lui envoyer un premier message qui est url (ligne 2) qui est un paramètre, donc ici qui est une chaîne de caractères. Et puis on va utiliser la cascade, donc je vous rappelle le point virgule à la fin (ligne 2). C'est-à-dire qu'au même receveur, on va lui envoyer un nouveau message qui s'appelle get
.
Ce bout de code en fait permet de simuler exactement ce que ferait votre navigateur web, quand vous lui rentrez l'URL et qu'on appuie sur entrée, si je tape l'URL et que j'appuie sur entrée, en fait on contacte le serveur de cette application web et ça nous rend une réponse HTTP en l'occurrence les informations sur un livre donné, et pas n'importe quel livre le livre numéro 1.
Prenons un autre exemple, une deuxième requête construite avec Pharo et ZnClient.
ZnClient new url:'http://localhost:8181/books/1'; formAt:'author' put:'van Caekenberghe et al'; formAt:'title' put:'Entreprise Pharo'; post
De la même manière on instancie un objet ZnClient
, on lui envoie un ensemble de messages en utilisant des cascades. Et puis, on peut voir en fait quelque chose qu'on avait déjà vu, c'est que en Pharo on a des keywords messages c'est-à-dire que le nom de la méthode, c'est formAt: put:
, et c'est équivalent avec une syntaxe Java classique à FormAtput('author', 'van Caekenberghe et al' )
, donc le nom de méthode tout collé et je passe tous les arguments entre parenthèses.
Ci-dessous le code complet de cette petite application web, construite avec Zinc.
|books teapot| books := Dictionary new. teapot := Teapot configure: { #defaultOutput -> #json. #port -> 8181 }. teapot GET: '/' -> '<h1>A simple book server</h1>'; output: #html; GET: '/books' -> books; GET: '/books/<id:IsInteger>' -> [:request|books at: (request at: #id) asString]; POST: '/books/<id>' -> [ :request | |book| book := { 'author' -> (request at: #author). 'title' -> (request at: #title)} asDictionary. books at: (request at: #id) put: book ]; start.
Je vais vous présenter maintenant certains morceaux de ce code point par point. Tout d'abord par exemple, on a une première partie qui correspond à la configuration du serveur. Donc on a en premier lieu ici sur la première ligne des déclarations de variables locales qui commencent par des lettres minuscules, je vous rappelle. Donc books teapot, deux variables locales qui sont dans des barres verticales. Ensuite, on a des affectations. Donc ici, on a une première affectation 2:= en Pharo. On peut avoir des symboles, donc le point numéro 3 on a #port qui est ici dans le code donc qui correspond à un symbole, donc c'est une chaîne unique qui ne sera créée qu'une seule fois. On a des messages qui sont envoyés à la classe teapot, là par exemple, on a la classe qui est ici. Et puis, je vais lui envoyer le message configure. Donc configure: je vous rappelle le 2 points c'est pour marquer la présence d'un argument qu'on va envoyer dans cette méthode. Et là l'argument commence par une accolade et se termine ici par une accolade. Donc ce qu'il y a entre accolades c'est un tableau dynamique. Tout ce qui est entre accolades, en fait on va évaluer chacune des expressions séparées par des points dans ce tableau-là, et on va construire un tableau avec le résultat de chacune des expressions. On voit qu'il y a qu'un seul argument dans la méthode configure. Et puis à l'intérieur de ce tableau dynamique entre accolades, on va utiliser ici la flèche qui va permettre de construire des objets association. C'est une clé, une valeur. Pour faire marcher le serveur, on ne va pas seulement définir la configuration du serveur, on va aussi définir des roots, ce qu'on appelle des roots. Je vous explique sur un exemple plus petit, donc un extrait de code du code complet. Si je veux dans mon application, être capable de traiter des urls qui ressemblent à ça, qui se terminent par books/1, si je veux les informations du livre no 1 par exemple, donc je vais définir ce qu'on appelle une route dans mon application Zinc, je vais dire quand je reçois une requête de type GET qui commence par /books/ et puis quelque chose qui est un entier, vous voyez ici id qui est un entier, alors exécute ce block de code. Donc un block, je vous rappelle ça commence par un crochet, ça termine par un crochet, c'est une méthode anonyme qui peut prendre un paramètre, en l'occurrence ici il y a un paramètre qui s'appelle request qui commence par: et qui est séparé par une barre verticale. Et ensuite le corps du block, toutes les expressions qui sont dedans, ici il n'y en a qu'une expression c'est celle-là, donc on va envoyer le message At à l'objet books, Ok, et puis on veut quel livre dans la collection de livres. En fait on veut le livre qui correspond à l'id qui a été passé en paramètre dans l'url. Je vais demander à la requête. La variable qui est ici c'est bien le paramètre du block qui était défini au début. Je vais récupérer l'élément qui s'appelle id dans cette requête ici. Je vais convertir cet élément, souvenez-vous c'était un entier, je le convertis en chaîne de caractères. Et puis ça va me permettre de récupérer le livre no 1. En conclusion, on a revu tous les points syntaxiques de Pharo dans cette séquence. L'objectif c'était vraiment de s'intéresser à la syntaxe. Mais on a pu en même temps redécouvrir cette syntaxe sur un package qui est assez intéressant, qui est vraiment rigolo et fun à programmer qui est Teapot. Vous pouvez aller le découvrir par vous-même et le charger depuis Smalltalkhub. Donc ça permet de construire facilement des applications http, on l'a vu le très simplement, et en fait c'est un package qui est construit au-dessus de Zinc. Et Zinc, c'est une des bibliothèques très solides qui existent en Pharo pour faire des applications Web plus complexes, comme on le verra dans les séquences suivantes.