Outils pour utilisateurs

Outils du site


cours:informatique:dev:programmation_objet_pharo:315_application_http_basique

Application HTTP simple en Pharo

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.

  1. ZnClient new
  2. url:'http://localhost:8181/books/1';
  3. 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.

  1. ZnClient new
  2. url:'http://localhost:8181/books/1';
  3. formAt:'author' put:'van Caekenberghe et al';
  4. formAt:'title' put:'Entreprise Pharo';
  5. 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.

  1. |books teapot|
  2. books := Dictionary new.
  3. teapot := Teapot configure: {
  4. #defaultOutput -> #json.
  5. #port -> 8181 }.
  6.  
  7. teapot
  8. output: #html;
  9. GET: '/' -> '<h1>A simple book server</h1>';
  10. GET: '/books' -> books;
  11. GET: '/books/<id:IsInteger>' -> [:request|books at: (request at: #id) asString];
  12. POST: '/books/<id>' -> [ :request |
  13. |book|
  14. book := { 'author' -> (request at: #author).
  15. 'title' -> (request at: #title)} asDictionary.
  16. books at: (request at: #id) put: book ];
  17.  
  18. start.

Je vais vous présenter maintenant certains morceaux de ce code point par point.

On a une première partie qui correspond à la configuration du serveur. En premier lieu, 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 (lignes 2 à 5). On a une première affectation ligne 2 le symbole d'affectation est := en Pharo.

On peut avoir des symboles, ligne 5 on a par exemple #port c'est une chaîne unique qui ne sera créée qu'une seule fois.

On a ensuite des messages qui sont envoyés à la classe teapot, on a la classe ligne 3. Elle reçoit le message configure:. Pour rappel, le caractère : c'est pour marquer la présence d'un argument qu'on va passer à cette méthode.

Ici 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 passé à la méthode configure:, c'est un tableau dynamique et à l'intérieur, on va utiliser ici la flèche -> qui va permettre de construire des objets association: une clé, une valeur.

Pour faire fonctionner le serveur, on ne va pas seulement définir la configuration du serveur, on va aussi définir ce qu'on appelle des routes.

Prenons l'exemple de la route ligne 11. Si je veux que mon application soit capable de traiter des URLs qui ressemblent http://localhost:8181/books/1, qui se terminent par le motif books/x, en affichant les informations du livre n° x, je vais définir ce qu'on appelle une route dans mon application Zinc (association d'un motif d'URL et d'une action).

Je vais dire quand je reçois une requête de type GET qui commence par /books/ suivi d'un entier, ici id, alors exécute le 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 :request qui commence par : et qui est séparé par une barre verticale.

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, 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 la requête. Je vais convertir cet élément, souvenez-vous c'était un entier, je le convertis en chaîne de caractères. Au final ça va me permettre de d'afficher 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. Il permet de construire 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, 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.

cours/informatique/dev/programmation_objet_pharo/315_application_http_basique.txt · Dernière modification : 2022/08/15 10:36 de yoann