Donc là je vais juste remettre ce que tout a fait, un base, comme ça je l'ai, et etc.
Il faudrait...
Alors ce que j'ai fait c'est que j'ai fait carrément un autre répertoire.
Je suis pas sûr que... bref.
Oui, ignore ce truc là, c'était une fausse manip de ma part.
Je vais faire un autre répertoire Python, pour ranger le script Python.
Bon c'est un peu le bazar, parce que là c'est fixeur, c'est du JavaScript, du Node.js.
Là je l'appelle Python pour l'instant.
C'est pas très très grave, c'est un bac à sable.
Donc j'ai infifié essay.py, et puis ce que je voudrais te montrer c'est la syntaxe,
ça va être un petit peu comme Axios tout à l'heure, ça va être une librairie.
Il y a toujours, il y a les deux dimensions si tu veux.
Quand tu regardes une technologie, enfin un langage de programmation,
afin de savoir si... là je me remets sur mes slides tout à l'heure.
Alors on va mettre ça ici.
Quelques langages, quelques librairies par un langage non exhaustif.
Alors JavaScript, son petit nom JS, slash Node, Node.js sous-entendu.
Client, serveur.
Donc le client c'est quoi ? Le client c'est ce qui consomme les API, c'est celui qui fait les requêtes.
Le serveur c'est celui qui envoie les réponses.
On a vu tout à l'heure, avec Postman on fait des requêtes, on reçoit des réponses.
Donc nous on a utilisé Axios.
Là on vient d'utiliser Axios.
On va voir que côté serveur on utilisera un truc qui s'appelle express.
On fera ça juste après là.
Je pense qu'on aura le temps déjà de commencer nos premières fonctions côté API aujourd'hui.
On pique.
Là on va utiliser un truc qui s'appelle aio-http.
Alors pourquoi ? Parce qu'en fait il y en a d'autres.
Il y a request, il y a httpx.
Pareil, il y a deux choses que Axios et il y a deux choses que express.
Mais après recherche, je me suis aperçu que pour ce cours-là aio-http allait être le plus simple.
Parce que c'est pas un cours piton en fait, c'est un cours sur les API.
Donc on recherchait à faire au plus simple.
Tout en revanche, le côté serveur, on utilisera une autre librairie qui s'appelle Flask.
Pourquoi différentes librairies ? Parce que la logique n'est pas tout à fait la même d'un côté et de l'autre.
Tu te souviens, on disait programmation événementielle justement avec callback.
Dans le premier cas de figure, on dit je m'abonne à tel événement.
Donc en gros, ça veut dire qu'il y a sûrement un thread quelque part qui écoute.
Soit il y a un thread qui écoute, soit on s'est enregistré dans une liste quelque part.
Et quand l'événement se produit, il y a un nœud central dans l'exécution qui va voir la liste des abonnés et qui les prévient.
Les mécanismes comme ci ou comme ça.
Et dans le deuxième cas, on contacte une ressource en donnant le callback au moment où on contacte.
Donc dans un cas en fait, on dit préve-moi quand tu veux.
Dans le deuxième, on dit j'aimerais ça et voici comment m' répondre.
Mais attention, je ne vais pas attendre des heures.
Le deuxième cas, c'était donc je fais une requête en passant le callback et en disant je ne vais pas attendre des heures.
Ça, c'est le côté client le plus souvent.
C'est-à-dire qu'il va y avoir quand même cette notion de time-out de la requête.
Si je fais la requête auprès de la ressource, si j'attends trop longtemps, ça va forer.
C'est même moi qui vais, c'est même moi, côté client, qui va annuler la demande.
Le premier mode en revanche de dire s'il se passe ça, voilà ce qu'il faut appeler.
Ça va être une logique qu'on va trouver plutôt côté serveur.
Parce que une API, quand on dit serveur, c'est-à-dire le côté API.
Du côté de l'API, on va être ouvert en permanence sans pouvoir prédire quand est-ce qu'on va nous appeler.
Donc en fait, on va se comporter exactement comme un serveur web.
On va ouvrir une connexion sur un port sur notre machine et on va écouter ce port en permanence
en attendant des jours, des semaines s'il faut que quelqu'un nous contacte via le web, via sport sur votre machine.
Et quand il va nous contacter, on va regarder ce qu'il nous a demandé.
Et donc en fonction de ce qu'il nous a demandé, on va appeler telle méthode ou telle méthode.
Donc on va être vraiment sur une logique qui va ressembler beaucoup à un abonnement à un événement.
Donc voilà, c'est pour ça qu'on a des librairies différentes parce qu'elles permettent de simplifier le code,
à faire en quelques lignes ce qu'il nous demanderait des dizaines et des dizaines si on faisait en natif.
Donc on va maintenant installer celle-là parce qu'on va faire un client en python.
Je me mets ici dans le terminal et je vais faire pip install iohttp.
pip c'est l'équivalent pour python de npm, ce qu'on va faire.
pip install iohttp, donc normalement je vais déjà installer chez moi.
Donc moi il me dit pas la peine, tu l'as déjà installé.
Donc ça devrait jouer.
C'est bon, ça a été chargé. Super.
Et maintenant on va copier du code que j'ai trouvé en ligne.
Alors attends, je vais pas m'embêter. Je vais carrément mettre l'onglet.
Voilà, donc il nous donne un exemple qui est pas mal. On va le prendre tout de suite.
Je vais mettre ça.
Le premier snippet que je trouve, je vais mettre chez moi.
Et puis je crois que ça va marcher du premier coup.
Mais je vais partir ici, faire ici url="
Et je vais récupérer celle de mon premier exemple, fixer.
Et ici à la place de l'http.pyton.org je vais mettre url="
Là je peux presque essayer d'exécuter ça et voir ce qui va se passer.
Sans même encore mettre le token. Justement déjà si le code fonctionne.
Donc je vais essayer.
Ouais, j'ai vu ça, j'ai vu ça. C'est pour ça que je dis que je croise les doigts.
Alors, Python file.
Il a pas émetté. Effectivement, non module name de...
Ici, depuis là je mets pip install io-http.
Il dit qu'il est déjà assez bizarre.
Non, je pense pas.
Est-ce que c'est parce qu'il a lib de flood down ?
Ah, attends, attends.
Non, sur Python non.
Si je vais dans cd.pyton.
Là je fais pip install io-http.
Est-ce qu'il va me mettre...
Je vais mettre un stackoverflow.
Ouais, je voulais pas aller aussi loin que ça, mais il faut peut-être effectivement utiliser un environnement...
Pile moi mon version, est-ce que c'est ça ?
3.12, ouais c'est pour ça. Ok, j'utilise une autre version de Python.
Alors attends.
C'est un truc de version de Python parce qu'il y en a plusieurs sur l'ordi.
Alors, Ctrl Shift P, Python Select Interprete.
Voilà.
Est-ce que ça, ça va changer ?
C'est genre avant que c'est le même.
Python Select Interprete.
Ah ok, je l'avais pas eu.
Écoute, on va essayer.
Ah ouais, pas mal.
Alors j'ai fait Ctrl Shift P.
J'ai tapé Python, j'ai mis Select Interpreteur.
Et il faut choisir le 3.9.
Du coup on a les mêmes machines, normalement tu dois pouvoir le faire aussi.
Ouais, tu tapes Python et après tu scroll un peu et c'est Python Select Interpreteur.
Tu l'avais, tu l'avais, yes. Il est 3.9.
Voilà.
Donc tu devrais maintenant pouvoir recopier
le code qui se trouve ici.
Je vais t'envoyer le lien que tu as trouvé.
Alors tu fais F5 ?
Voilà.
Donc ce que j'ai fait chez moi, c'est que j'ai simplifié un peu.
J'ai mis ici URL égale, pour l'instant je mets juste le premier, là,
DataFixer.io à payer les tests.
J'ai remplacé ici sur la ligne avec Async with Session.
J'ai mis du coup URL.
Et puis le seul truc que je viens juste de changer, c'est après HTML,
j'ai enlevé leur petit bidoui pour écrire que le début.
Donc j'ai juste mis HTML.
Je vais faire le token.
Donc c'est ce qui est le plus important.
C'est bon ? Oui.
Donc maintenant je vais tuer le token.
C'est pas mal.
On va regarder.
Access key égale.
Et puis après du coup, il faut que tu utilises URL with token sur tailing 11.
Voilà, ça devrait être bon.
Donc tu vois, il y a eu un petit temps d'attente avant qu'il renvoie tout,
mais très léger.
Nous on simulera, je sais pas si on aura le temps de faire ça aujourd'hui,
mais on le fera demain en tout cas, on simulera une API qui prend du temps
pour bien voir à quel point ça peut être important de faire
de l'asynchrone au niveau programmation.
Au niveau programmation encore une fois.
Alors, écoute, c'est pas mal.
Donc là on s'est munis pour l'instant, c'est assez régimentaire,
mais on s'est munis d'un bout de code qui fonctionne en JavaScript
et d'un bout de code qui fonctionne en Python.
On va aller interroger une API,
s'identer qu'on va voir la documentation de l'API,
de quoi elle a besoin, et on traduit ça
dans la construction de notre oracle dans le code.
Et donc maintenant, ce que je propose, c'est que
ça attaque un petit peu à l'autre côté.
Pour ça, avant la fin de la journée, avoir vu les deux côtés au moins,
on va rester sur des trucs relativement simples.
On ira plus dans la complexité de domaine encore.
Mais comme ça on aura vu l'autre côté qui est intéressant aussi.
Je vais du coup créer encore un autre répertoire,
parce que maintenant ce que je vais faire, je reviens à ma slide.
Maintenant ce que je voudrais c'est faire le côté serveur.
Alors on peut choisir d'abord Python, d'abord JavaScript,
on va prendre JavaScript juste parce que ça va plus vite,
je le connais mieux, etc. mais on fera aussi le Python.
Ça c'est des grands standards, je vais l'inscrire Python,
et bien sûr on fera C Sharp aussi.
Donc c'est pas mal d'avoir des bouts de code qui traînent
qu'on a réussi à faire fonctionner si jamais on a besoin.
Donc nous on va faire maintenant avec Express.
C'est pour ça que là où on avait un programme ici,
je reviens sur la machine, donc dans fixer.io,
tu vois j'avais fait npm install axios,
et ça m'a créé tout ça, ça m'a créé Node Modules,
Package, Package ici.
Donc ce répertoire était devenu de facto un projet Node.
C'est pour ça que je vais faire un autre répertoire,
parce que maintenant je suis côté serveur.
Je vais d'ailleurs l'appeler ServerJS.
Et donc ici je vais créer un FIFI,
je vais l'appeler MainJS.
Il n'y a pas de convention particulière.
Et ici je vais faire mon console log coucou,
juste pour assurer que je serais dans le bon terminage.
Je fais F5.
Alors ça va être une Node.js effectivement.
F5 j'ai dit.
J'ai tout fermé, c'est ça un view.
Debug console.
Terminal, input.
F5.
Ok c'est bon.
Je n'aurais pas dû fermer la fenêtre.
Ok, donc maintenant que je suis ici,
et que je suis dans le bon répertoire,
je vois ici Terminal, formation API,
non tu vois je ne suis pas dans le bon répertoire.
Je vais descendre d'un cran, je vais aller dans ServerJS.
Parce que je veux que tout ce qui va importer là,
je vais mettre mon npm install,
comme pour Axios pour tout à l'heure,
je voudrais qu'il le mette dans ce répertoire.
Donc je descend ici, ServerJS.
Et maintenant je vais faire,
ça va être npm install mais express.
Tout simplement.
64 packages.
Et express il a plein d'autres dépendances.
Ok.
Alors on va aller voir la doc.
On a ouvert ici Axios, on a ouvert ensuite IOHTTP,
à cette époque-là on va aller voir JS Express.
Alors il y a un peu plus de choses à expliquer
pour piger ce qui se passe,
mais je t'ai expliqué l'essentiel tout à l'heure en fait.
En disant que je vais m'ouvrir une connexion sur un port,
et je vais pouvoir écouter en permanence.
Getting started Hello World, est-ce qu'il est bien leur Hello World ?
Ouais il est pas mal.
Il est pas mal.
Donc nous on va pas faire get.
Ah si pardon, excuse-moi.
Justement, très très important.
Donc on prend de la différence.
On va lire le code du Hello World ici,
et essayer de comprendre ce qui se passe.
Quand j'utilisais Axios,
qui est une librairie cliente
pour aller attaquer un web service,
une web appelée,
et bien voilà, performing get request.
Donc j'avais ici Axios, mon objet,
un peu plus de formes,
et j'ai mis un peu plus de formes,
et je faisais get.
La méthode get dans Axios,
c'est une requête de type get.
Qui renvoie, bon c'est une promise,
mais peu importe, c'est du JavaScript.
Mais le plus important c'est qu'après je lui passais ici un callback.
Et ce callback c'était
quand j'obtenais une réponse à ma requête.
D'où le nom de la fiche,
donc ici, get,
c'est une requête vers la librairie,
la, pardon, vers la pays.
Et ensuite,
on passe au moyen d'une autre fonction,
le callback pour la réponse.
Maintenant, dans Express,
on est de l'autre côté en fait,
on est côté réception, on est côté APU.
Donc,
tout ça c'est
les préliminaires.
C'est pour dire, je vais créer une application
qui va écouter, je vais me mettre sur le port 3000,
c'est intéressant, c'est du web, mais je peux me mettre sur un autre port
que le port 80, par défaut.
Le plus important, je vais sauter tout de suite,
c'est ça, c'est l'ISAM.
C'est-à-dire que ça,
ça va être une exécution bloquante
qui va ouvrir une connexion sur,
alors le port il est là, 3000,
et qui va,
alors je sais depuis,
il faudrait qu'on lise la doc,
cette méthode-là,
est-ce qu'elle l'exécute au début,
ou à chaque fois qu'elle reçoit un truc,
je sais pas, on va regarder dans la doc, mais en tout cas, il passe une méthode.
Je pense que c'est au démarrage.
Donc ça doit s'exécuter à mon avis qu'une fois.
Et ça, ça va bloquer, c'est-à-dire que ça va rester ouvert tout le temps.
Donc, typiquement,
ce programme-là,
il va s'arrêter de, il va se déconnecter de ce port
et il va s'éteindre, en fait, que si j'interromps le programme,
genre avec Ctrl-C, ou si je reboot la machine.
Donc ce programme-là, il est très rudimentaire.
Un vrai programme, il va avoir peut-être des instructions
pour s'arrêter dans certains cas, etc.
Mais lui, là, il bloque sur la ligne 11,
enfin, la ligne 9-10-11,
quoi, l'instruction,
il reste bloqué dessus, et puis il peut rester des jours et des jours
à la place, là.
Et là, il met un callback.
Mais c'est un callback, donc, côté serveur.
Donc derrière l'API, si tu veux,
là, ils disent, si tu reçois une requête GET à cette adresse,
alors t'appelles cette méthode.
Et là, tu vas pouvoir en mettre plusieurs, en fait. Tu vas pouvoir en mettre un, puis deux, puis trois, puis quatre.
Et après, tu fais l'issue.
Dans le cadre de notre API bancaire, là,
on a des instructions comme ça dans la LSI, c'est boum, boum, boum, boum,
pour chacun des points d'entrée, là. Voilà.
Et à chaque fois, une méthode particulière qui fait un boulot.
Et rec res, c'est la requête, la réponse.
Donc l'objet réponse, en fait, il est res, là.
Il est prémaché, déjà. C'est pour ça que Express, c'est vraiment pratique à utiliser.
Il fait presque tout le boulot, déjà, pour nous.
Rec,
à l'intérieur de cette méthode-là,
va nous donner accès à tout ce qu'il y a dans la requête.
Donc si, par exemple, dans la requête,
je vais retourner sur notre code.
Attends, je vais trouver du JavaScript, parce que c'est du JavaScript.
Voilà. Si nous, dans notre requête, on lui mettait un paramètre
dans l'URL accessKey,
et bien, côté, ici, là,
avec rec, je pourrais le récupérer, ce paramètre.
Ce sera sûrement un truc du genre rec.params.accesskey.
Tout à fait, pareil, que ça va être un truc comme ça.
Pareil, si on avait mis un header,
donc ici, si on avait un header authorization,
ben, pareil, côté, ici, là, ce serait rec.headers.authorization.
Donc là, on pourrait tout récupérer, ce qu'il y a dans la requête.
Et en fonction de, justement, tous ces paramètres,
on peut récupérer tout ce qu'il y a dans la requête.
Et en fonction de, justement, tous ces paramètres,
on va choisir ce qu'on fait.
Et puis, res, c'est trop facile, rien. Res.find.
Et là, on lui envoie ce qu'on veut.
Donc là, il se font une version très simpliste
qui renvoie juste,
en réponse, un texte.
Mais on va aller regarder dans la doc,
et en fait, il va y avoir moyen d'envoyer des headers,
les fameux headers de la réponse, là.
Tu vois. C'est à ce moment-là qu'on va aller mettre
ces dans res....
Alors, il y a sûrement plein de syntaxes différents,
on va regarder.
Et donc, ça, c'est plutôt ce qui va aller dans le body.
C'est le pédop.
Voilà. Donc, on va se le faire, celui-là.
Et puis, on l'exécutera sur notre machine.
Et puis, on essaiera de l'appeler depuis l'autre code, en fait.
Donc, on va faire du code qui l'envoie vers l'autre.
Alors, potentiellement, on va peut-être avoir un souci,
parce que le problème qu'on va avoir, c'est quoi ?
C'est un bête problème réseau, en fait.
C'est qu'on va pas pouvoir avoir sur la même machine
une connexion qui écoute sur un port,
et puis une autre connexion qui essaie de se faire sur ce port-là
et puis, on va pouvoir avoir un autre type de machine.
Ça va pas marcher. Donc, ce qu'on essaiera,
c'est de s'envoyer de ta machine à la même.
Voilà. Donc, on peut copier ça, par exemple,
pour essayer de faire un début.
Ouais, c'est ça. NPM install express
dans un répertoire ici.
Il faut faire attention à la bande.
Je vais enlever le console.
Là, je vais juste copier ce qu'il y a dans express.
Je l'enregistre.
Et puis, main.js, je vais le garder tout à l'heure.
C'est bien comme nom, je trouve.
Je vais juste renommer ça hello world.
Et puis, voilà. Maintenant qu'il s'appelle hello world,
je vais l'exécuter.
Donc, c'est du node.js, effectivement.
Et là, normalement, ce qu'il va faire...
Alors, tu vois, là, il me fait une petite alerte parce qu'il me dit
« Ouh là là, attends, t'essaies de te connecter au réseau,
est-ce que c'est pas une activité suspicieuse ? »
Non. Il se trouve que je sais ce que je fais, donc je vais dire
que j'autorise, autorise, allow access.
Voilà. Donc, si je vais dans debug console maintenant,
on me dit... Ouais, c'est ça.
La méthode qui est là, pardon, ici, là.
Ça, c'est une fonction.
C'est une syntaxe alternative en JavaScript, là.
Je sais pas si t'as déjà vu ça.
C'est plutôt que d'écrire function, tu peux écrire comme ça.
Voilà.
L'équivalent, c'est ça. C'est function et sans la flèche.
Voilà. C'est pareil.
Et là, tu le regardes, il me met ici,
« example app listening on port »
à le port. Et là, il est en train d'écouter, en fait.
Et tu as vu que l'exécution ne s'arrête pas.
Il est en train d'exécuter des trucs en boucle.
Il attend qu'on lui envoie quelque chose
sur le port 3000.
Et il va répondre « hello world ».
Quoi qu'on lui envoie, il en fait rien de toute façon.
Parce qu'ici, regarde.
Il ne fait rien avec Rec.
Donc, si tu veux, on va regarder
comment on peut faire ce communiqué dans ma file.
Je te laisse déjà peut-être faire tourner le truc chez toi.
Et puis, je vais chercher les adresses
pour qu'on puisse...